equals()没有给出预期的结果

时间:2018-08-27 11:21:59

标签: java

我正在做一个小项目,其中有“国家,人口和大陆”课程。

“人口”和“洲”这两个类别都使用Enums定义可能的值。我想在“国家/地区”中使用“工厂方法”创建新的国家/地区。代码如下:

public enum Continent {
    EUROPE, 
    ASIA, 
    AMERICA;
}

public enum Population {
    LOW(1000000),
    AVERAGE(2000000),
    HIGH(5000000); 
} 

public class Country{  

    private Continent=null;  
    private Population=null;

    Country(Continent continent, Population population){  
        this.continent=continent;  
        this.population=population;  
    }

好的,所以我的问题是我试图覆盖我的equals()函数,但它没有给我预期的结果。

public boolean equals(Country other){  
    if(this.population == other.population && this.continent==other.continent)
        return true;
    else 
        return false;  
}

但是断言测试给了我以下结果

  

java.lang.AssertionError:[新国家/地区(欧洲,HIGH)]预期:
  <“罗马尼亚(Country @ 464a7b61)”>等于:<“罗马尼亚(Country @ 488d8dd8)”>
  但不是。

我当时在网上寻找,发现的是当给出相同的参数时,它应该知道它是相同的,例如对于相同的参数,不应有两个不同的对象。我敢肯定我是否正确理解了它,但它似乎很重要。

我仍然不知道这种情况以及如何解决。想法?

更新:
在出现一些建议之后,我尝试将equals函数更改为

public boolean equals(Country other){  
    if(this.population.equals(other.population) && this.continent.equals(other.continent))
        return true;
    else 
        return false;  
}

更新2:

public boolean equals(Object o){  
    if(this.population.equals(o.population) && this.continent.equals(o.continent))
        return true;
    else 
        return false;  
}  

不允许我做 .population .continent

5 个答案:

答案 0 :(得分:3)

您的equals()方法签名错误

它应显示为:

  @Override
  public boolean equals(Object o) {

注意用Object o代替Country

答案 1 :(得分:0)

您缺少static注释。另外,您不转发@Override,而是转发Country

答案 2 :(得分:0)

有关面向对象编程的一些基本知识:

当您从某个类(例如Object)派生并且想要覆盖super类中的方法时,您需要匹配该方法的签名。在您的情况下,您要覆盖Object::equals,因此需要匹配其签名。

@RobAu写道,这是

public boolean equals (Object o)  

这又意味着您的编译器将不允许您使用访问子类的任何成员。因此,您需要(a)检查参数的类别,并(b)硬转换为Country

作为替代方案,您可以使用Lombok之类的库,该库将为您生成典型的equals / hash组合(请参见https://projectlombok.org/features/EqualsAndHashCode

快乐的编码。

答案 3 :(得分:0)

除了签名更改外,还指出了其他答案,您还需要检查参数是否为Country类型。只有它是您才能访问其属性。以下代码可以做到这一点:

public boolean equals(Object o) {
    if(!(o instanceof Country))
         return false;
    Country c = (Country) o;
    if(this.population.equals(c.population) && this.continent.equals(c.continent))
        return true;
    return false;  
}

答案 4 :(得分:-1)

您应该在枚举中实现/重写Object,然后在方法中使用equals运算符比较两个枚举。 另外,您忘记了.equals批注,因此永远不会调用此方法,因为不知道您已覆盖它。