2017-02-27 63 views
0
@Override 
public boolean equals(Object obj){ 
    if(obj == this){ 
     return true; 
    } 
    if(obj instanceof Circle){ 
     Circle circle = (Circle) obj; 
     if(circle.getWidth()==getWidth()) 
      return true; 
    } 

說我必須返回一個布爾值,但我是,我告訴編譯器返回true; ??說我必須返回一個布爾值?

+6

考慮這一點,會發生什麼如果'obj'不等於'this'並且'obj'不是'Circle'? – Zircon

+2

在末尾放置一個'return false;',因爲否則可能達到方法的末尾而不會遇到'返回'語句 – AntonH

+0

歡迎來到SO,請編輯您的帖子以給出確切的錯誤,近似值不會幫助,需要標點符號和例外的完整英文句子 – Gray

回答

3

你沒有沿着函數的所有路徑返回一些東西。

如果obj不是這個,它不是Circle的一個實例,那麼這個函數不會返回任何東西。

你可能想要的功能看起來是這樣的:

@Override 
public boolean equals(Object obj){ 
    if(obj == this){ 
     return true; 
    } 
    if(obj instanceof Circle){ 
     Circle circle = (Circle) obj; 
     if(circle.getWidth()==getWidth()) 
      return true; 
    } 
    return false; 
} 
+0

This imp lementation違反了Object.equals合同,請參閱https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object- –

-1

所有路徑都必須返回。你不能定義一個「不總是」返回你所說的值的方法。 (至少不是強類型語言,就像Java一樣)。問題是,你說如果給定的對象是一個圓,並且它與這個對象(實例)具有相同的寬度,那麼它就是同一個對象。但是如果對象不是一個圓,你永遠不會告訴編譯器?或者它是一個,但沒有相同的寬度?

解決該問題的正確方法是在if語句中添加else子句,將其變爲擴展的if語句。讓我們一起來看看:

@Override 
public boolean equals(Object obj) 
{ 
    if(obj == this) 
    { 
     return true; 
    } 
    else if(obj instanceof Circle) 
    { 
     Circle circle = (Circle) obj; 
     if(circle.getWidth() == getWidth()) 
      return true; 
    } 
     return false; //this is what's missing, now the compiler knows what to do 
    } 
} 

了懷疑這樣的,你可以親自給我發短信。如果你不斷問這樣的問題,人們會在這裏冷落你。直接把它們發給我,我會給你提供答案(如果我清醒並知道答案),否則我會冒你自己的名譽,以防我不知道答案,因爲我有一點點空閒。

卡洛斯,你能給我一個休息嗎?不知道有4個空格在那裏。我不想吸引同情或任何其他的感覺,我只是想幫助別人,而不是炫耀。我經常犯錯,這就是爲什麼我認同那些錯誤的人。不僅模糊不清,而且基本的東西都是錯誤的。不管他們的問題是什麼,人們都應該得到尊重和實際答案。我個人和卑鄙的觀點只是,我希望它不會干擾網站?

+1

不正確,如果在寬度不相等的情況下缺少內部'if'的返回 –

+0

你是對的,請原諒我。讓我解決這個問題。 – FinnTheHuman

+0

,並確定最後一行不會編譯,既不會引起一些同情......實際上它可能不應該成爲答案的一部分,更像是評論 –

0

請仔細閱讀Java API specifications。它清楚地寫着:

這是對稱:對於任何非空引用值x和y,x.equals(y)應返回true當且僅當y.equals(x)返回true。

因此,不幸的是,基於obj instanceof MyClass風格條件的非最終類的任何實現最終都會違反該規則。

設想你通過FilledCircle具有一個新的領域backgroundColor延伸Circle和實例化一個Circle x與寬度= 1和一個與FilledCircle y寬度= 1和backgroundColour =紅色。當執行equals時,像其他答案中建議的那樣,x.equals(y)將產生true,因爲yCircle的實例,寬度相同。但y.equals(x)將產生false,因爲x不是FilledCircle的實例。

正確實現的是這樣的(Eclipse生成和相當冗長,但它看起來是這樣的,如果你不想違背針對equals - 方法合同:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Circle other = (Circle) obj; 
    if (width != other.width) 
     return false; 
    return true; 
}