如果你的对象只包含接口,如何定义hashcode和equals?

时间:2016-05-12 20:20:45

标签: java interface hashcode

让我们假设我有一个简单的(java)类,它只包含3个接口对象。这三个对象一起构成了地图的关键值。现在我的问题是:如何为该类定义equals和hashcode?我的意思是,该类的所有成员都只是没有实现任何内容的接口?

示例:

class SomeKey {
  public SomeKey(SomeWeiredInterface1 a, SomeWeiredInterface2 b,     SomeWeiredInterface3 c){
    ....
}
}

最直接的方式是:

public boolean equals(Object other){
SomeKey otherKey = (SomeKey)other;  

return a.equals.otherKey.a && b.equals.otherKey.b && c.equals.otherKey.c;
}

对我而言,它看起来根本不可能,或者至少我必须自己编写这些方法,因为我不能使用(或委托)任何哈希码或等于实现这些接口的方法?

感谢任何提示! 的Thorsten

4 个答案:

答案 0 :(得分:2)

所有接口都隐式声明Object类中的所有公共方法(请参阅JLS § 9.2)。您可以调用接口类型的equalshashCode方法,它将在任何具体的类实现接口时调用重写的方法,或者它将调用从{{继承的那些方法的默认实现。 1}}。

您可以用同样的方式编写Object的{​​{1}}和equals方法,而不考虑字段类型是类还是接口:

hashCode

答案 1 :(得分:1)

这些是我的IDE自动生成的equals()和hashCode()方法:

public class SimpleClass {
private SimpleFirstInterface firstField;
private SimpleSecondInterface secondField;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    SimpleClass that = (SimpleClass) o;

    if (firstField != null ? !firstField.equals(that.firstField) : that.firstField != null) return false;
    return secondField != null ? secondField.equals(that.secondField) : that.secondField == null;

}

@Override
public int hashCode() {
    int result = firstField != null ? firstField.hashCode() : 0;
    result = 31 * result + (secondField != null ? secondField.hashCode() : 0);
    return result;
}

}

这两个方法在其中使用了接口实现的equals()和hashCode()方法,如果它们在那里提供的话。如果没有,那么将使用Object的equals()和hashCode()的标准实现。

答案 2 :(得分:0)

可以使用(委托)实现类的等号和哈希码方法但是是的,您可以&#t; t < / strong>依赖他们。

实现类可能包含hashcode&amp; equals不会为同一个对象产生唯一的结果或同一个对象的不同哈希码。

我相信这3个接口是不是标记接口,并且有一些方法可以返回实现类的成员变量的状态。 如果以上情况属实,那么您可以在自己的hashcode()&amp;中使用状态。等于实施。

参见示例:

Interface A{
   getValue();
}

Interface B{
   getData();
}

class AImpl implements A{
      private String value;

      public String getValue(){
            return value;
      }
}
class BImpl implements B{
      private int data;

      public int getData{
            return data;
      }
}

class SomeKey{

   private A value;
   private B data;

    //constructor
    public SomeKey(A value, B data){
         this.value = value;
         this.data = data;      
    }

 @Override
 public int hashcode(){
     int result = 1;
     result = 29 * result + value.hashcode();
     result = result + data.hashcode();
     return result;
 }
 //similarly override equals
}    

答案 3 :(得分:-1)

或许类似于使用Comparable Interface覆盖方法hashcode(),equals()和compareTo()。尝试使用其他接口。 我没有看到上面的答案,当然还有很好的例子。

  private static class SomeString implements Comparable<SomeString> {
   private final String s;
   SomeString(final String s) {
   this.s = s;
  }

@Override
public int compareTo(final SomeString o) {
 return s.compareTo(o.s);
}

}

 @Override
 public boolean equals(final Object o) {
  if(o == null) return false;
  if(this == o) return true;
  if(this.getClass() != o.getClass()) return false;

  final SomeString o1 = (SomeString) o;
  return compareTo(o1) == 0;
 }

  @Override
  public int hashCode() {
   return s.hashCode();
  }

private static class SomeString implements Comparable<SomeString> { private final String s; SomeString(final String s) { this.s = s; } @Override public int compareTo(final SomeString o) { return s.compareTo(o.s); }