Java では、クラスが同じ名前とメソッドを定義する複数のインターフェイスを実装する場合、署名を作成すると、どのメソッドが使用されるのかという疑問が生じます。 overridden?
Java 言語仕様 (JLS) に従って、コンパイラは次のルールに基づいてオーバーライドするメソッドを決定します。
< p>複数のインターフェースから継承されたメソッドは「オーバーライド同等」とみなされます (JLS 8.4.8.4)同じ署名がある場合。したがって、必要なメソッド実装は 1 つだけです。
例:
public class Test実装 A, B { <br> public static void main(String... args) throws Exception{ </p> <p>}</p> <p>@Override<br> public int f() { // インターフェース A または B から</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return 0;
}
}
< ;/pre>
このコードでは、クラス Test はインターフェイス A と B を実装します。同じシグネチャを持つ f() という名前のメソッドがあります。これらのメソッドはオーバーライドと同等であるため、どのインターフェイスの f() メソッドが Test.f() によってオーバーライドされるかは問題ではありません。必要な実装は 1 つだけであり、コンパイラは 2 つのインターフェイスを区別しません。
この動作は、継承とメソッドの隠蔽にまで及びます。インターフェイス メソッドがスーパークラスまたは別のインターフェイスのメソッドと競合する場合、コードが有効になるためには、競合するメソッドがオーバーライド同等である必要があります。
互換性の例:
<br>公開インターフェイス ギフト { void present(); }<br>パブリック インターフェイス ゲスト { void present(); }</p> <p>public class Presentable 実装 Gift, Guest { <br> @Override <br> public void present() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">System.out.println("Heeeereee's Johnny!!!");
}
}
ここでは、 Gift と Guest の両方に present() メソッドがあります。 Presentable クラスは両方のインターフェイスを実装し、present() の単一の実装を提供します。コンパイラは、これらのメソッドがオーバーライドと同等であり、個別の実装を必要としないことを認識します。
非互換性の例:
パブリック インターフェイス Gift { void present(); }<br>パブリック インターフェイス ゲスト { boolean present(); }</p><p>public class Presentableimplements Gift, Guest { // コンパイルできません!!!<br> // エラー: Gift と Guest の型に互換性がありません<br>}<br>
この場合、present() メソッドの戻り値の型が異なります。 JLS 8.4.8.3 によれば、オーバーライドするメソッドには互換性のあるシグネチャと戻り値の型が必要です。 Gift.present() と Guest.present() には互換性のある戻り値の型がないため、コードはコンパイルされません。
要約すると、同じメソッド シグネチャを持つ複数のインターフェイスを実装する場合、コンパイラはオーバーライドされるメソッドを、オーバーライドと同等のメソッドとして識別します。これは、どのインターフェースがメソッドを定義しているかに関係なく、必要なメソッド実装は 1 つだけであることを意味します。
以上がJava は、同じメソッド シグネチャを持つ複数のインターフェイスをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。