クラスにこれらのメソッドのデフォルトの実装を強制的にオーバーライドさせたいようです。その場合、これを行う方法は、abstract として宣言されたメソッドを持つ抽象スーパークラスを宣言することです。例えば:
public abstract class MyBaseClass implements ... /* existing interface(s) */ {
public abstract boolean equals(Object other);
public abstract int hashCode();
public abstract String toString();
}
次に、現在のクラスをextend
このクラスに変更します。
このアプローチは機能しますが、理想的なソリューションではありません。
既存のクラス階層では問題になる可能性があります。
既存のインターフェースを実装するクラスに、特定の抽象クラスを拡張するよう強制するのは悪い考えです。たとえば、メソッド シグネチャのパラメータを変更して、既存のインターフェイスではなく抽象クラスを使用できます。しかし、最終的にはコードの柔軟性が低下します。(とにかく、人々はこれを覆す方法を見つけることができます。たとえば、super.<method>(...)
呼び出しでメソッドを「実装」する独自の抽象サブクラスを追加することによって!)
特定のクラス階層/実装パターンを課すことは近視眼的です。将来の要件の変更によって、制限が問題を引き起こすことになるかどうかは予測できません。(これが、特定のクラスではなくインターフェイスに対するプログラミングを推奨する理由です。)
インターフェイスがクラスにこれらのメソッドの再宣言を強制しない理由についての実際の質問に戻ります。
これが強制されないのはなぜですか? 他のメソッドを実装しないと不平を言いますが、これらの 3 つを強制することはありません。何を与える?手がかりはありますか?
インターフェイスは、それを実装する具象クラスが各メソッドの実装を持つという制約を課します。ただし、クラス自体がこれらのメソッドを提供する必要はありません。メソッドの実装は、スーパークラスから継承できます。そして、この場合、それが起こっているのです。から継承されたメソッドjava.lang.Object
は、制約を安全にします。
JLS 8.1.5には次のように記載されています。
「宣言されているクラスが抽象クラスでない限り、各直接スーパーインターフェースのすべての抽象メンバーメソッドは、このクラスの宣言によって、または直接スーパークラスまたは直接スーパーインターフェースから継承された既存のメソッド宣言によって実装する必要があります (§8.4.8.1) 。抽象ではないクラスは抽象メソッドを持つことが許可されていないためです (§8.1.1.1)」。