2

メソッドをオーバーライドするためにインターフェースの実装を要求することは可能Objectですか?

たとえば、sでキーとして一般的に使用されるインターフェイスがある場合、そのインターフェイスのすべての実装にandメソッドHashMapをオーバーライドするように要求することができます。hashCode()equals()

ただし、次のインターフェイスがある場合...:

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

  @Override
  public boolean equals(Object o);
}

...次の実装はコンパイルされます:

public class MyImplementation(){
}

からこれらのメソッドを継承するため、hashCode()またはをオーバーライドするメソッドは必要ありません。equals()Object

1つのアプローチは、インターフェースの代わりに抽象クラスを使用するように切り替えることです。

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にあるため、すべての拡張機能が抽象クラスのコントラクトを満たす必要があるということです。一方、インターフェイスは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 に答える