在Java中,是否可以要求接口的实现来覆盖Object方法?

时间:2012-08-17 16:06:05

标签: java interface abstract-class

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

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

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

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()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,因此所有扩展都需要满足抽象类中的契约。虽然接口不是Object,所以不要坐在层次结构中,但接口的任何实现都必须是Object,此时它继承Object方法,并且从而满足界面“契约”。

然而,回到我原来的问题......是否有办法要求实现接口来覆盖Object方法?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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();
}