2017-02-27 31 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; 
}