@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; ??
答案 0 :(得分: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;
}
答案 1 :(得分:1)
请仔细阅读Java API specifications。它清楚地写着:
对称:对于任何非空引用值x和y,
x.equals(y)
当且仅当y.equals(x)
返回true时才返回true。
所以很遗憾,基于obj instanceof MyClass
风格条件的非最终类的任何实现最终都违反了该规则。
假设您将Circle
扩展到FilledCircle
,其中包含一个新字段backgroundColor
并实例化一个宽度= 1的Circle x
和一个宽度= FilledCircle y
的{{1}} 1和backgroundColour =红色。在实施其他答案equals
中建议的x.equals(y)
时,true
会产生y
,因为Circle
是y.equals(x)
的实例且宽度相同。但false
会产生x
,因为FilledCircle
不是equals
的实例。
正确的实现看起来像这样(由Eclipse生成并且非常详细,但如果您不想违反@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;
}
方法的合同,它看起来像这样:
Input:
[
{startTime: 0, endTime: 1}, // meeting from 10:00 – 10:30 am (1 = 30 minutes)
{startTime: 3, endTime: 5}, // meeting from 12:00 – 1:30 pm
{startTime: 4, endTime: 8},
{startTime: 10, endTime: 12},
{startTime: 9, endTime: 10},
]
Expected Output:
[
{startTime: 0, endTime: 1},
{startTime: 3, endTime: 8},
{startTime: 9, endTime: 12},
]
答案 2 :(得分:-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
}
}
再次怀疑这样,你可以亲自给我留言。如果你不断提出这样的问题,人们会在这里忘记你。直接发送给我,我会向你提供答案(如果我醒着并知道答案),或者我为你的风险冒了我自己的声誉,以防我不知道&# 39;知道答案,因为我有一点点空闲。
卡洛斯,你能给我休息一下吗?不知道那里有4个空间。我不想吸引同情或任何其他感觉,我只是想帮助别人,而不是炫耀。我经常犯错,这也是我认识那些错误的人的原因。不仅是错误的错误,而是基本的错误。无论他们的问题是什么,人们都应得到尊重和实际答案。我的个人和拙见只是,我希望它无论如何都不会扰乱网站?