2014-01-21 106 views
0

好吧,這真的是一個簡單的問題,但我不明白爲什麼我的代碼無法正常工作。java,覆蓋和等於

在我使用的是第三部分庫,在某一點上是這樣做:

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

現在,我的對象是同一個類的實例,即重寫equals具有以下合同:

@Override 
public boolean equals(Object obj) { 

jvm anyway調用由對象類定義的等於,給我一個不想要的行爲。 我該如何解決這個問題? 我重複說調用代碼是我無法修改的外部庫。

編輯:這是我班的全碼:

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

請分享你的等於執行... – Frank

+0

http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java你有沒有正確的覆蓋它? –

回答

0

重寫equals方法並實現自己的代碼。您可以使用instanceof運算符來實現您自己的equals方法,它實際檢查實例變量的類型是否相同。這是用於比較兩個字符串的代碼。

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反正調用由對象類

你怎麼知道JVM執行等於由對象類定義中定義的等號?

假設被稱爲Object.eqauls:即使你已經覆蓋equals方法,通過IDE提供的,比如Eclipse的默認實現,內部提供了超一流的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方法。

對不起,浪費你的時間。