2

是否可以要求实现接口来覆盖Object方法?

例如,如果我有一个通常用作HashMaps 中的键的接口,我可能希望要求该接口的所有实现都覆盖hashCode()andequals()方法。

但是,如果我有以下界面......:

public interface MyInterface(){
  @Override
  public int hashCode();

  @Override
  public boolean equals(Object o);
}

...以下实现编译:

public class MyImplementation(){
}

它不需要覆盖hashCode()或的方法equals(),因为它从 继承这些方法Object

一种方法可能是切换到使用抽象类而不是接口:

public abstract class MyAbstractClass(){
  @Override
  public abstract int hashCode();

  @Override
  public abstract boolean equals(Object o);
}

然后任何扩展这个抽象类的类都需要重写hashCode()and equals()

// doesn't compile - requires implementation of hashCode() and equals()
public class MyClass extends MyAbstractClass {
}

// does compile
public class MyClass extends MyAbstractClass {
  @Override
  public int hashCode(){
    // calculate hashcode
  }

  @Override
  public boolean equals(Object o){
    // check equality
  }
}

我的假设是,它们之间的区别在于抽象类是一个Object,所以它Object在层次结构中低于,所以所有扩展都需要满足抽象类中的合同。然而,接口不是Objects,所以不要坐在层次结构中,但是接口的任何实现都必须是Object,此时它继承了Object方法,因此满足接口“契约”。

但是,回到我最初的问题......有没有办法要求接口的实现来覆盖Object方法?

4

2 回答 2

4

仅使用接口无法完成您想要的事情。

通过强制使用抽象基类来执行此操作的另一种(可能更清晰)方法如下:

public abstract class MyAbstractClass {
  @Override public final int hashCode() { return hashCodeImpl(); }
  @Override public final boolean equals(Object o) { return equalsImpl(o); }

  protected abstract int hashCodeImpl();
  protected abstract boolean equalsImpl(Object o);
}
于 2012-08-17T16:19:29.567 回答
0

不,Java 无法表达这种要求。怎么有这样的抽象类?

public abstract class MyAbstractClass(){
  @Override
  public int hashCode(){
    return myOverrideHashCode();
  }

  @Override
  public boolean equals(){
    return myOverrideEquals();
  }

  protected abstract int myOverrideHashCode();

  protected abstract booleans myOverrideEquals();
}
于 2012-08-17T16:19:52.640 回答