オブジェクト指向プログラミングの領域では、クラスは複数のインターフェイスを実装できます。しかし、これらのインターフェイスが同じシグネチャを持つメソッドを所有している場合、次のような疑問が生じます: コンパイラはどのインターフェイス メソッドがオーバーライドされるかをどのように解決するのでしょうか?
Java では、そのような重複するメソッドを持つ複数のインターフェイスを実装するクラスは、有効な実装を 1 つだけ持ちます。 。コンパイラは、インターフェイスの起源に基づいてメソッドを区別しません。
この概念を理解するために、次の例を考えてみましょう。
interface A { int f(); } interface B { int f(); } class Test implements A, B { @Override public int f() { return 0; } }
このシナリオでは、テストは A と B の両方を実装します。 、両方のインターフェイスは、同じシグネチャを持つ f() という名前のメソッドを定義します。 Test でこのメソッドをオーバーライドすると、@Override アノテーションが 1 つだけ存在する場合でも、クラスは両方のインターフェイスから f() メソッドを効果的にオーバーライドします。
これは、Java の継承ルールにより、同一のシグネチャを持つメソッドが考慮されることが規定されているためです。 「オーバーライド同等」。その結果、コンパイラは、インターフェイスの起源に関係なく、最初に検出したオーバーライド メソッドを選択します。
さらに、競合するメソッドの戻り値の型が異なる場合、非互換性が発生する可能性があります。このような場合、同じシグネチャで戻り値の型が異なる 2 つのメソッドを同じクラス内に持つことはできないため、コンパイラはエラーを報告します。
この点を説明するために、例を次のように変更してみましょう。
interface Gift { void present(); } interface Guest { boolean present(); } class Presentable implements Gift, Guest { @Override public void present() { System.out.println("Present as a gift!"); } }
ここで、 Gift.present() と Guest.present() の戻り値の型には互換性がありません (void と boolean)。結果として、Presentable はオーバーライド ルールに違反するため、両方のインターフェイスを実装できません。
結論として、クラスがオーバーライドと同等のメソッドを持つ複数のインターフェイスを実装する場合、コンパイラは実装するメソッドが 1 つだけであると認識し、オーバーライド メソッドの @Override アノテーションは、すべてのインターフェイスに適用されます。ただし、メソッド シグネチャ間に互換性がない場合、コンパイル エラーが発生します。
以上がJava は複数のインターフェースでメソッドをオーバーライドする際のあいまいさをどのように解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。