从类外部运行父类定义的相等方法

时间:2016-06-07 15:44:10

标签: java polymorphism equality

如果我有一个复杂的继承层次,我想做一个依赖于特定相等性的相等性检查,有一种方法可以确保我使用该等式检查运行,而不是由子类重写的版本可能表现不同那我想要?

举一个例子,假设我有一个foo与它自己的平等类,然后我有一些类似boo的东西,类似于类似下面的sudocode(懒得完全正确)< / p>

 class Foo {

   int id;
   int otherId;
   int count;

   public boolean equals(Object other){

     //check other instance of foo and re-cast

     return (id==other.id && otherId==other.otherId)
   }
}

class Bar extends Foo{

     private someObject uniqueValue;

     public boolean equals(Object other){

        //check other instance of foo and re-cast

        return super.equals(other) && other.getUniqueValue.equals(this.getUniqueValue);
   {
}

然后我有一些方法需要太多的foo对象引用相同的foo并为它们加起来

  public combineFoos(Foo foo1, Foo foo2){

      if(! foo1.equals(foo2))
          throw IllegalArgumentException("no match");

      Foo combinedFoo=new Foo(foo1.id, foo1.otherId, (foo1.count + foo2.count))

      return combinedFoo
   }
 }

理论上这一切都有效,直到条形值出现。现在,如果我调用combineFoo并将条形图传递给foo1则会失败,因为条形相等的方法检查foo2是一个instanceOf条。如果foo2是一个酒吧,我真的不在乎,我需要的信息可用于任何foo。就此而言,如果我传入两个不等的条,它们都是由foo的相等方法定义的(即只有uniqueValue字段不同),我希望combineFoo仍然接受它们作为相等的Foo&#39; s,即使不相同于Bar的定义。

问题在于我想要对FOO认为平等的内容进行平等检查,但我不知道我可能实际收到的奇怪的继承课程。有没有办法解决这个问题,基本上说在我的combineFoo中总是使用等于的FOOs定义,即使它被子类重写了?

相关的,这是一个更糟糕的想法然后我想它即使可行,或者是否有其他方式来处理类似上面的例子,没有有效地重写foo的相同方法combineFoo?

1 个答案:

答案 0 :(得分:0)

如果a.equals(b)然后b.equals(a),则等于方法的对称测试失败。修复它的明显方法是检查类,如下所示:

   public boolean equals(Object other){
     if(other.getClass() != this.getClass()) return false;
     return (id==other.id && otherId==other.otherId)
   }

说过你可能希望允许一些子类对彼此相等 - 在这种情况下我建议你查看这个问题: Java - equals method in base class and in subclasses