メソッドをオーバーライドするためにインターフェースの実装を要求することは可能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
にあるため、すべての拡張機能が抽象クラスのコントラクトを満たす必要があるということです。一方、インターフェイスはObject
sではないため、階層に配置しないでください。ただし、インターフェイスの実装はすべてである必要がありObject
、その時点でObject
メソッドを継承するため、インターフェイスの「コントラクト」を満たします。
しかし、私の元の質問に戻ります...Object
メソッドをオーバーライドするためにインターフェースの実装を要求する方法はありますか?