2014-01-21 5 views
0

ok Это действительно простой вопрос, но я не могу понять, почему мой код не работает должным образом.java, overriding и equals

В третьей части библиотеки я использую, в определенный момент что-то вроде этого сделано:

Object value = someValue; 
Object compareValue = someOtherValue; 
if(value.equals(compareValue)) 
// do something 

теперь, мои объекты являются экземплярами одного и того же класса, что переопределение равно со следующим контрактом:

@Override 
public boolean equals(Object obj) { 

jvm в любом случае вызывает равные значения, определенные классом объектов, что дает мне нежелательное поведение. Как я могу это исправить? Повторяю, что вызывающий код является внешней библиотекой, которую я не могу изменить.

редактировать: это полный код моего класса:

public class MissionPriorityResolutionCriteria implements ResolutionCriteria { 
private Satellite prioritySatellite; 

public MissionPriorityResolutionCriteria(Satellite prioritySatellite) { 
    this.prioritySatellite = prioritySatellite; 
} 



@Override 
public int hashCode() { 
    int hash = 5; 
    hash = 53 * hash + (this.prioritySatellite != null ? this.prioritySatellite.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final MissionPriorityResolutionCriteria other = (MissionPriorityResolutionCriteria) obj; 
    if (this.prioritySatellite != other.prioritySatellite && (this.prioritySatellite == null || !this.prioritySatellite.equals(other.prioritySatellite))) { 
     return false; 
    } 
    return true; 
} 

public Satellite getPrioritySatellite() { 
    return prioritySatellite; 
} 

public void setPrioritySatellite(Satellite prioritySatellite) { 
    this.prioritySatellite = prioritySatellite; 
} 

public boolean apply(SRASolution s) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 
} 

Я знаю, что он звонит в Object.equals, потому что я вышел с отладчиком ... Равных реализации я использую генерируемых netbeans.

+3

Если вы правильно переопределили, этого не может быть. – Kayaman

+5

Пожалуйста, поделитесь своей реализацией equals ... – Frank

+0

http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java У вас есть чрезмерный урон? –

ответ

0

Переопределить метод equals и реализовать собственный код. Вы можете реализовать свой собственный метод equals с помощью оператора instanceof, который фактически проверяет тип переменных экземпляра, такие же или нет. Это код, используемый для сравнения двух строк.

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
     if (anObject instanceof String) { 
      String anotherString = (String)anObject; 
      int n = count; 
      if (n == anotherString.count) { 
       char v1[] = value; 
       char v2[] = anotherString.value; 
       int i = offset; 
       int j = anotherString.offset; 
       while (n-- != 0) { 
        if (v1[i++] != v2[j++]) 
         return false; 
       } 
       return true; 
      } 
     } 
     return false; 
    } 
+0

Проверка 'obj.getClass() == MyClass.class' часто лучше, чем' instanceof', потому что равенство должно быть симметричным: http://stackoverflow.com/questions/596462 – yshavit

0

JVM все равно называют Равных, определенные классом объекта

Как вы знаете, что виртуальная машина под названием равна определяется классом объекта?

Предполагая, что называется Object.eqauls: Даже если вы переопределен равно метод, реализация по умолчанию на предоставляемые IDE, такие как затмения, внутренне дает вызов супер класс equals() метод, который в вашем случае может быть Object.eqauls.

В среде IDE автоматически сгенерированный код будет выглядеть примерно так:

@Override 
public boolean equals(Object obj) { 
    // TODO Auto-generated method stub 
    return super.equals(obj); 
} 

В качестве решения, заменить вызов на super.equals() с собственной логикой для сравнения.

1

проблема была. Некоторая сбой произошла со сложным сочетанием maven и netbeans. Это означает, что код, который я отлаживал, был устаревшей версией, которая не содержит метод equals.

Извините за то, что потратил время.

Смежные вопросы