说我必须返回一个布尔值?

时间:2017-02-27 21:24:54

标签: java

@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; ??

3 个答案:

答案 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,因为Circley.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个空间。我不想吸引同情或任何其他感觉,我只是想帮助别人,而不是炫耀。我经常犯错,这也是我认识那些错误的人的原​​因。不仅是错误的错误,而是基本的错误。无论他们的问题是什么,人们都应得到尊重和实际答案。我的个人和拙见只是,我希望它无论如何都不会扰乱网站?