我正在做一个小项目,其中有“国家,人口和大陆”课程。
“人口”和“洲”这两个类别都使用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
答案 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
批注,因此永远不会调用此方法,因为不知道您已覆盖它。