Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展对象的Equals要检查super.Equals(),如果我不想检查,这应该是组合而不是继承吗_Java_Inheritance - Fatal编程技术网

Java 扩展对象的Equals要检查super.Equals(),如果我不想检查,这应该是组合而不是继承吗

Java 扩展对象的Equals要检查super.Equals(),如果我不想检查,这应该是组合而不是继承吗,java,inheritance,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)) {

因此,情况如下:

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 
    }    
      ...
   }  
}
问题是,实际上这种继承是正确的,但对于程序来说,它不一定是正确的。我的想法是猫实际上应该由猫组成。问题是,我应该采取哪种方法

编辑

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

我通常不建议继承,除非每个孩子都是父母。你必须问问自己,Cat的每一个实例都是真正的猫吗?

我不使用eclipse,所以我从未见过这种实现。我想这在很多情况下都是有道理的

把它去掉,然后从头开始写你自己的就没问题了。在这种情况下,我仍然可以放心地使用继承


我不会太担心你们试图遵循的这些准则,现在就做有意义的事情。您无法预测未来需求的所有变化。请列出测试用例列表,并验证您的设计是否符合您今天所知道的测试用例。

Ohoh在继承方面的平等性检查。这很难正确描述,也很难描述

正确的解决方案并不像人们想象的那样直截了当,所以请走吧——这应该会澄清你所有的问题。如果您不想再问一次:)

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

  • 它是自反的:对于任何非空值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,x.equals(y)的多次调用应始终返回true或false,前提是没有修改对象上equals比较中使用的信息
  • 对于任何非null值x,x.equals(null)应返回false
为了保证这一点,我们需要指定另一种方法:
publicbooleanCanequal(objectother)
。如果另一个对象是(重新)定义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;
    }
}

如果您从一个类继承,那么如果猫科动物已经通过了该检查,那么您的Cat类就不能相等。那是什么

if (!super.equals(obj))
{
    return false;   //If I don't want this should I use 
} 
是的。它并没有说明如果猫科动物返回真的会发生什么。如果它的实现正确,它将检查类的相等性,然后您只需要检查齿


默认实现只是提供了一个确定“不平等”的快捷方式。以你的例子来说,猫总是猫,所以如果猫说我这里的不是猫(即狗),那么你可以放心,它不可能是猫。但是如果它说是猫,那么就由你来决定这只猫是(家里的)猫还是老虎。

在现实世界中是的,问题更多地围绕着Eclipse提供的equals实现。这不是你想要的答案,但它肯定是相关的:在你的情况下,没有办法添加方面(“牙齿”,尽管如此[?]猫科动物有牙齿……但关键在于;)并保持平等的(…)契约。从《有效Java自身》一书中,以下引用以粗体显示:“在保留equals契约的同时,根本无法扩展一个可实例化类并添加一个方面”。诉诸权威:去和约书亚·布洛赫争论吧,不是我,我只是引用《有效的Java》一书。)在《有效Java》中,哪一章是我面前的那本书。在我的版本(第一版)中,我在“第3章:所有对象通用的方法”中的“第7项:在重写equals时遵守通用契约”中引用了这句话。希望有帮助:)这个观点是如何建立的?它肯定有一个数学答案,这很有帮助。似乎解决方案是组合。如果您从该链接添加一些信息,我将非常乐意将其标记为正确答案。@Voo:+1,一个经典链接:)我在关于有效Java的评论中提到它时犹豫不决。这解决了问题,因为您摆脱了继承,但您可以“正确”解决此问题而仍然使用继承。正如文章所示,它相当复杂,但可行。在你的例子中什么是最好的取决于你打算用它做什么——继承经常被过度使用,但确实有它的用途。从逻辑的角度来看,猫应该是猫。是的,我想我应该补充一些简短的总结——这是一个如此复杂的话题,我总是喜欢与一些真正的专家联系,但如果我有什么错误,肯定会有人纠正我;)