2015-01-16 50 views
1

我試圖讓我的「等於」方法工作,但遇到了麻煩。這應該很簡單,但我對此很陌生。我想我必須將其他項目投給一對,以便能夠使用.fst並檢查這兩個對是否相等,但是我很難「正確投射」。任何幫助將非常感激。我有以下幾種方法:將對象鑄造到一對

public void setFst(T1 aFirst) 
{ 
    fst = aFirst; 
} 

public void setSnd(T2 aSecond) 
{ 
    snd = aSecond; 
} 

public boolean equals(Object otherObject) 
{ 
    Pair aPair = (Pair)otherOject; //--------> ??? 

    if(otherObject.fst.equals(this.fst) && otherObject.snd.equals(this.snd)) 
    { 
     return true; 
    } 
} 

下面是我收到的錯誤:

./Pair.java:84: cannot find symbol 
symbol : variable fst 
location: class java.lang.Object 
       if(otherObject.fst.equals(this.fst) && otherObject.snd.equals(this.snd)) 
          ^
./Pair.java:84: cannot find symbol 
symbol : variable snd 
location: class java.lang.Object 
       if(otherObject.fst.equals(this.fst) && otherObject.snd.equals(this.snd)) 
                   ^
+2

你爲什麼使用'otherObject'而不是'aPair'? –

回答

0

的主要問題是,你已經投之後,你與原始otherObject相比,這仍是一個在Object類,而不是你的任務aPair具有類型Pair

這樣的左手側的可變的情況下,這應該讓你去:

public boolean equals(Object otherObject) 
{ 
    Pair aPair = (Pair)otherOject; //--------> ??? 

    if(aPair.fst.equals(this.fst) && aPair.snd.equals(this.snd)) 
    { 
     return true; 
    } 
} 

雖然要小心。你在做什麼被稱爲未經檢查的鑄造。你的編譯器可能會警告你。您不知道傳遞給您的equals方法的對象是否真的可以投射到Pair--它必須是Pair的實例或Pair的子類,因爲這是一個有效的操作。因此,例如,如果您將StringInteger對象傳遞到方法中,則您的演員陣列在運行時可能會失敗。

EIT

@ NathanHughes的more complete answer這個問題向您介紹如何檢查鑄造(使用的instanceof關鍵字),所以我就不在這裏重複了。

我推薦Oracle java這個教程文檔。檢查this tutorial的類和子類 - 最後是關於如何投射並檢查它是否有效投射。

+0

你是完全正確的,我傳遞字符串和整數,並得到一個運行時錯誤。任何想法,我會如何避免這種情況?這些指令是「如果該對等於aPair,則返回true」。我如何讓字符串和整數之間進行比較,如果我正在執行未經檢查的投射,有沒有辦法「檢查」我的投射?我爲我的java無能表示抱歉。 –

+0

每個人都必須學習。 @NathanHughes剛纔的答案顯示瞭如何檢查鑄件(使用instanceof關鍵字)。我推薦Oracle Java教程文檔用於這種事情。查看http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html的類和子類 - 最後是關於如何投射並檢查它是否有效投射 –

1

這並不是那麼容易,這比你想象的更多的陷阱。

您的equals方法必須允許擁有屬於您正在編寫它的類以外的類的對象。你所要做的就是檢查是否該參數是也是一對:

if (otherObject == null) return false; 
if (otherObject.getClass() != Pair.class) return false; 

後該檢查通過,你可以安全地轉換,並指定投對象到一個新的局部變量:

Pair otherPair = (Pair)otherObject; 

然後使用otherPair上的字段進行等號檢查。此時,您已完成otherObject參數,其餘的equals方法不應再引用它。

整個事情看起來像

public boolean equals(Object otherObject) { 
    if (otherObject == null) return false; 
    if (getClass() != otherObject.getClass()) return false; 
    Pair otherPair = (Pair)otherObject; 
    return otherPair.fst.equals(this.fst) && otherPair.snd.equals(this.snd); 
} 

假設FST和SND不允許爲空。在空成員上調用equals方法將導致NullPointerException。爲了避免NPE如果FST或SND爲空,檢查成員對他們的呼籲平等之前是空的:

public boolean equals(Object otherObject) { 
    // check if references are the same 
    if (this == otherObject) return true; 
    // check if arg is null or something other than a Pair 
    if (otherObject == null) return false; 
    if (getClass != otherObject.getClass()) return false; 
    Pair otherPair = (Pair)otherObject; 
    // check if one object's fst is null and the other is nonnull 
    if (otherPair.fst == null || this.fst == null) { 
     if (otherPair.fst != null || this.fst != null) return false; 
    } 
    // check if one object's snd is null and the other is nonnull 
    if (otherPair.snd == null || this.snd == null) { 
     if (otherPair.snd != null || this.snd != null) return false; 
    }   
    // each member is either null for both or nonnull for both 
    return ((otherPair.fst == null && this.fst == null) || otherPair.fst.equals(this.fst)) 
    && ((otherPair.snd == null && this.snd == null) || otherPair.snd.equals(this.snd)); 
} 

這最後一位是討厭寫,集成開發環境會產生這個東西給你。以下是Eclipse生成的內容:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Pair other = (Pair) obj; 
    if (fst == null) { 
     if (other.fst != null) 
      return false; 
    } else if (!fst.equals(other.fst)) 
     return false; 
    if (snd == null) { 
     if (other.snd != null) 
      return false; 
    } else if (!snd.equals(other.snd)) 
     return false; 
    return true; 
} 

還記得實施hashCode。

+0

謝謝!出於某種原因,當兩個字符串具有相同字符但順序不同時,此代碼返回「true」。我將如何解決這個問題?對於我缺乏Java知識,我再次抱歉。 –

+0

@Ronon:這真的很奇怪。你確定它是這個方法還是你沒有實現hashCode的問題?如果T1或T2在等號方法上有問題,你會在這裏看到一個問題。 –

+0

測試(ZUeEuHVWxXWi,12)是否等於(ZUeEhHVWxXWi,12):PASS 測試(ZUeEhHVWxXWi,12)是否等於(UeEuHVWxXWi,12):FAIL(這是我運行測試程序時顯示的內容,字符串是不相等的,但它返回的是,我相信這可能是我的代碼的另一部分的問題。謝謝你的幫助! –

0

最好做

@Override 
public boolean equals(Object otherObject) { 
    if (otherObject instanceof Pair) { 
    Pair otherPair = (Pair)otherObject; 
    return otherPair.fst.equals(fst) && otherPair.snd.equals(snd)) 
    } 
    return false; 
} 
+0

請在你的'if'和左括號之間加一個空格,好像人們已經變得如此擔心浪費空間,他們試圖通過使所有'if '''do ... until','while'塊看起來像函數。瘋狂! –

+0

傾向於將大括號放在與if語句的條件部分相同的行上,它可以讓你獲得更多的代碼屏幕上,並且它減少了某人(通常意味着我們自己)在這兩者之間作出陳述的機會,使整個塊無條件地生效。 –

+0

不幸的是,這會返回一個空指針異常。我相信這是一個有效的解決方案,但是在我的代碼中必然存在一個錯誤... –

0

otherObjectObject一個實例,並沒有對Object沒有fst。需要更改爲aPair.fst.equals

+1

我想你的意思是說對象上沒有'fst',因爲'fst'只在'aPair'上# –

+0

@EdwinBuck是的一個錯字,謝謝。 – fastcodejava

+1

不是問題,拼寫錯誤會一直髮生。 –