扩展对象的等于想要检查 super.equals(),如果我不想进行此检查,这应该是组合而不是继承[关闭]

2024-04-18

所以场景如下:

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目的。问题是,我应该采用这些方法中的哪一种?

EDIT
这是 Eclipse 的实现,默认 equals/hashcode。 equals 的实现可能不是最准确的方法。


哦哦,继承时的平等检查。这是非常难以正确描述的,而且描述起来也很长。

正确的解决方案并不像人们想象的那么简单,所以请继续读这个 http://www.artima.com/lejava/articles/equality.html- 这应该可以解决你所有的问题。如果没有请随时再问:)

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

  • 它是自反的:对于任何非空值 x,表达式 x.equals(x) 应返回 true。
  • 它是对称的:对于任何非空值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 它是传递性的:对于任何非空值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应返回 true。
  • 它是一致的:对于任何非空值 x 和 y,如果对象的 equals 比较中使用的信息没有被修改,则多次调用 x.equals(y) 应一致返回 true 或一致返回 false。
  • 对于任何非空值 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 方法本身必须始终首先检查给定对象是否 canEqual 本身,例如类似的东西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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展对象的等于想要检查 super.equals(),如果我不想进行此检查,这应该是组合而不是继承[关闭] 的相关文章

随机推荐