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),无论是否使用注释,它都会工作。“此方法从未调用,因为不知道您已重写它。”这不是注释的工作方式,甚至不是它存在的原因。这一个只用于开发人员,我相信他们很容易指出方法被重写了。