java - Equals for extended object 想要检查 super.equals(),如果我不想要这个检查,这应该是组合而不是继承

标签 java inheritance

<分区>

所以场景如下:

class Feline  
{  
   String name;  
   int age;  

   equals(Object obj) {...}  
   hashCode(){...}  
}  


class Cat extends Feline  
{  
   int teeth;  

   hashCode(){...}  
   equals(Object obj)  
   {
     if (!super.equals(obj))
    {
        return false;   //If I don't want this should I use 
    }    
      ...
   }  
}

问题是这个继承在现实中是正确的,但对程序来说却不一定正确。我对此的想法是 Cat 实际上应该由 Feline 对象组成。问题是,我应该采用哪种方法?

编辑
这是 Eclipse 的实现,默认 equals/hashcode。执行 equals 可能不是执行此操作的最准确方法。

最佳答案

Oohoh 面对继承的平等检查。这很难正确描述,而且描述起来也很长。

正确的解决方案并不像人们想象的那么简单,所以请转read this - 这应该可以解决您所有的问题。如果不方便再问 :)

编辑:作为上述链接的简短摘要:相等方法应满足以下属性:

  • 它是自反的:对于任何非空值 x,表达式 x.equals(x) 应该返回 true。
  • 它是对称的:对于任何非空值 x 和 y,x.equals(y) 应该返回 true 当且仅当 y.equals(x) 返回 true。
  • 它是可传递的:对于任何非空值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应该返回 true。
  • 它是一致的:对于任何非空值 x 和 y,多次调用 x.equals(y) 应该一致地返回 true 或一致地返回 false,前提是在对象的 equals 比较中使用的信息没有被修改。
  • 对于任何非空值 x,x.equals(null) 应该返回 false。

为了保证这有效,我们需要指定另一个方法:public boolean canEqual(Object other)。如果另一个对象是(重新)定义了 canEqual 的类的实例,则此方法应返回 true,否则返回 false。

换句话说,如果我们覆盖 equal() 本身,则必须始终覆盖该方法。实现本身很简单,一个简短的例子:

class Foo {
    public boolean canEqual(Object other) {
        return other instanceof Foo;
    }
    // equals implementation, etc.
}

equals 方法本身必须始终首先检查给定对象是否可以等于自身,例如类似于 other.canEqual(this) && restOfComparison 的内容。

扩展上述 Foo 的类的简短示例:

class Bar extends Foo {
    public boolean equals(Object other) {
        if (other instanceof Bar) {
             Bar that = (Bar)other;
             return that.canEqual(this) && otherStuff;
        }            
        return false;
    }

    public boolean canEqual(Object other) {
          return other instanceof Bar;
    }
}

关于java - Equals for extended object 想要检查 super.equals(),如果我不想要这个检查,这应该是组合而不是继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7798569/

相关文章:

java - hadoop mapreduce IntWritable范围有多长?

java - 正则表达式检测字符串中的数字

java - 在 BroadcastReceiver 上使用 newInstance 时出现 InstantiationException

c++ - 使用指向基础抽象类的指针访问子类成员,这不能是 dynamic_cast

c# - 每个 ID 系统唯一对象的设计模式

c# - 继承:访问父成员

java - 在 Java 中,使用 BufferedWriter 或直接写入文件有什么区别?

C++/多态性/虚函数/为什么我的子类的函数没有被调用?

java - 我所有的自定义注释都有一个通用的基类型

java - 将应用程序的语言设置存储在另一个文件中