Java equals()未给出预期结果
我正在做一个小项目,在那里我有国家、人口和大陆课程 “人口”和“大陆”这两个类都使用枚举来定义可能的值。在国内,我想用“工厂方法”来创造新的国家。代码如下:Java equals()未给出预期结果,java,Java,我正在做一个小项目,在那里我有国家、人口和大陆课程 “人口”和“大陆”这两个类都使用枚举来定义可能的值。在国内,我想用“工厂方法”来创造新的国家。代码如下: public enum Continent { EUROPE, ASIA, AMERICA; } public enum Population { LOW(1000000), AVERAGE(2000000), HIGH(5000000); } public class Count
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:[新国家(欧洲,高中)]期望:等于:
但事实并非如此 我在网上查找,发现当给定相同的参数时,它应该知道它是相同的,例如,对于相同的参数,不应该有两个不同的对象。我确信我是否正确理解了它,但它似乎是相关的 我仍然不知道情况是否如此以及如何处理。想法 更新:
出现一些建议后,我尝试将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您的
equals()
方法的签名错误
应改为:
@Override
public boolean equals(Object o) {
注意
对象o
而不是国家
您的equals()
方法的签名错误
应改为:
@Override
public boolean equals(Object o) {
请注意,您缺少的是
@Override
注释,而不是Country
。此外,您没有转发国家
,但是对象
缺少@覆盖
注释。此外,您不需要转发国家
,而是对象
您应该在枚举中实现/覆盖等于
,然后在方法中使用.equals
操作符来比较两个枚举。
此外,您忘记了
@Override
注释,因此永远不会调用此方法,因为不知道您是否已重写它。您应该在枚举中实现/重写equals
,然后在方法中使用.equals
运算符来比较两个枚举。
此外,您忘记了
@Override
注释,因此从未调用此方法,因为不知道您是否已重写它。有关面向对象编程的一些基本知识:
当您从一个类(例如,对象
)派生,并且希望重写super
类中的一个方法时,您需要匹配该方法的签名。在您的例子中,您正在重写Object::equals
,因此需要匹配它的签名
正如@RobAu所写的,这是
public boolean equals (Object o)
这反过来意味着您的编译器将不允许您使用访问子类的任何成员。这就是为什么您需要(a)检查参数的类别,以及(b)对国家进行强制转换
作为替代方案,您可以使用类似Lombok的库,它将为您生成一个典型的equals/hash组合(请参阅)
愉快的编码。有关面向对象编程的一些基础知识:
当您从一个类(例如,对象
)派生,并且希望重写super
类中的一个方法时,您需要匹配该方法的签名。在您的例子中,您正在重写Object::equals
,因此需要匹配它的签名
正如@RobAu所写的,这是
public boolean equals (Object o)
这反过来意味着您的编译器将不允许您使用访问子类的任何成员。这就是为什么您需要(a)检查参数的类别,以及(b)对国家进行强制转换
作为替代方案,您可以使用类似Lombok的库,它将为您生成一个典型的equals/hash组合(请参阅)
快乐编码。除了其他答案指出的签名更改之外,您还需要检查参数是否属于国家类型。只有当它是时,您才能访问它的属性。以下代码执行此操作:
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;
}
除了其他答案所指出的签名变更外,您还需要检查参数是否属于国家类型
。只有当它是时,您才能访问它的属性。以下代码执行此操作:
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;
}
这些对象是如何创建的?不要在填充上使用=
,在那里也使用equals。并在人口对象上实现equals。当你使用=
时,这意味着对象必须是相同的而不是相等的。相等的签名不应该是'equals(Object o)'?@bilak你可以在enum
@RobAu上使用=
你是对的,我没有意识到这是一个枚举如何比较创建这些对象?不要在人口上使用=
,在那里也使用equals。并在人口对象上实现equals。当你使用==
时,这意味着对象必须是相同的,而不是相等的。相等的签名不应该是'equals(Object o)'?@bilak你可以在enum
@RobAu上使用=
你是对的,我没有意识到这是一个枚举。我不认为这是这里的关键。但是我在我的原始代码中确实有它。请注意关键点,但是注释会指出,equals(Country)
不是在超类中定义的,所以不能重写。我不认为它是这里的关键点。但是我在我的原始代码中确实有它。请注意关键点,但是注释会指出,equals(Country)
在超类中没有定义,所以不能overriden@Override,虽然受到高度鼓励,但没有必要。使用它很好(在本例中,编译器可能会抛出错误,因为他没有重写正确的方法),但如果重写equals(Object obj),无论是否使用注释,它都会工作。“此方法从未调用,因为不知道您已重写它。”这不是注释的工作方式,甚至不是它存在的原因。这一个只用于开发人员,我相信他们很容易指出方法被重写了。