在Java中通过重写equals()比较对象对象和类对象

在Java中通过重写equals()比较对象对象和类对象,java,overriding,equals,Java,Overriding,Equals,我试图重写接受对象作为输入的equals()方法 我在同一个包中有以下类 public class Herd{ int count; boolean exists; 在重写该方法的类中,我试图比较对象是否在位置、秩和它们是否是同一类中与变量匹配 public class Animal{ private Herd lot; private int rank; public boolean equals(Object animl) { if(this.

我试图重写接受对象作为输入的equals()方法

我在同一个包中有以下类

public class Herd{
   int count;
   boolean exists;
在重写该方法的类中,我试图比较对象是否在位置、秩和它们是否是同一类中与变量匹配

public class Animal{
   private Herd lot;
   private int rank;
   public boolean equals(Object animl) {
        if(this.getClass() == animl.getClass() && this.rank == animl.rank && this.lot == animl.**lot**) { 
            return true;
        }
        return false;
    }
我知道为了比较,我会使用一个对象,它有所有这些参数,然而,在动物类中,它说

for animl.rank "rank cannot be resolved or is not a field"
for animl.lot "lot cannot be resolved or is not a field"
我尝试向下转换,即(…==(动物)animl.rank),但它给了我一个不兼容的操作数类型错误。我还尝试将等级转换为int,但这给了我上述问题


感谢您的帮助。

您需要正确地投射您的
animl
对象:

public boolean equals(Object animl) {
        if(this.getClass() == ((Animal) animl).getClass() && this.rank == ((Animal) animl).rank && this.lot == ((Animal) animl).lot) { 
            return true;
        }
        return false;
    }
我认为如果您使用
equals
而不是
=
会更好:

public boolean equals(Object animl) {
        if(this.getClass() == ((Animal) animl).getClass() && this.rank.equals( ((Animal) animl).rank) && this.lot.equals( ((Animal) animl).lot)) { 
            return true;
        }
        return false;
    }
试试这个:

   private Herd lot;
   private int rank;
   public boolean equals(Object animl) {
        if(!(animl instanceof Animal))) {
            return false;
        }
        Animal an = (Animal)animl;
       return this.rank == an.rank && this.lot == an.lot;
    }

这些属性可能需要getter。我没有编译或测试任何内容。

Animal
中的方法
equals
,应该像这样重写:

  • 检查null和类是否相等
  • 投射要与动物进行比较的对象
  • 比较
    动物
    类的字段,注意对
    畜群使用
    等于
  • 公共类动物{
    // ...
    @凌驾
    公共布尔等于(对象o){
    如果(o==null | | this.getClass()!=o.getClass()){
    返回false;
    }
    如果(this==o)返回true;
    动物=(动物)o;
    返回this.rank==animal.rank&&
    this.lot!=null&&this.lot.equals(animal.lot);
    }
    }
    
    类似地,可能需要在
    Herd
    中重写方法
    equals

    公共类{
    // ...
    @凌驾
    公共布尔等于(对象o){
    如果(o==null | | this.getClass()!=o.getClass()){
    返回false;
    }
    如果(this==o)返回true;
    牧群=(牧群)o;
    返回this.count==herd.count&&this.exists==herd.exists;
    }
    }
    
    比较不会以这种方式工作。 信息:

    for animl.rank "rank cannot be resolved or is not a field"
    for animl.lot "lot cannot be resolved or is not a field"
    
    是正确的,因为对象类中没有此类属性。它们只存在于你的动物类中

    也就是说,在进行实际比较之前,您需要显式地将对象强制转换为Animal。试试这个:

    public class Animal{
       private Herd lot;
       private int rank;
       public boolean equals(Object animl) {
         Animal animal = (Animal) animl;
            if(this.getClass() == animal.getClass() && this.rank == animal.rank && this.lot == animal.lot) { 
                return true;
            }
            return false;
        }
    
    另一方面,您可能需要对
    this.lot==animal.lot

    ((animal)animl).rank进行嵌套比较