型が2つのインターフェースを実装し、それぞれinterface
が同一のシグニチャーを持つメソッドを定義する場合、実際には1つのメソッドしかなく、それらは区別できません。たとえば、2つのメソッドの戻り値の型が競合している場合は、コンパイルエラーになります。これは、継承、メソッドのオーバーライド、非表示、宣言の一般的なルールであり、2つの継承されたinterface
メソッド間だけでなくinterface
、スーパーclass
メソッドとの競合、またはジェネリックの型消去による競合にも適用されます。
互換性の例
ここでは、持っている例ですinterface Gift
あり、present()
(提示贈り物、のような)方法を、またinterface Guest
もあり、present()
この方法は、(のように、ゲストが存在し、不在ではありません)。
Presentable johnny
Gift
とaの両方Guest
です。
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { void present(); }
interface Presentable extends Gift, Guest { }
public static void main(String[] args) {
Presentable johnny = new Presentable() {
@Override public void present() {
System.out.println("Heeeereee's Johnny!!!");
}
};
johnny.present(); // "Heeeereee's Johnny!!!"
((Gift) johnny).present(); // "Heeeereee's Johnny!!!"
((Guest) johnny).present(); // "Heeeereee's Johnny!!!"
Gift johnnyAsGift = (Gift) johnny;
johnnyAsGift.present(); // "Heeeereee's Johnny!!!"
Guest johnnyAsGuest = (Guest) johnny;
johnnyAsGuest.present(); // "Heeeereee's Johnny!!!"
}
}
上記のスニペットがコンパイルされて実行されます。
必要なのは1つだけ であることに注意してください@Override
!!! 。これは、Gift.present()
およびGuest.present()
が「@Override
-equivalent」であるためです(JLS 8.4.2)。
このように、johnny
一つだけの実装があるのをpresent()
、そしてあなたがどのように扱うかは問題ではないjohnny
かなど、Gift
またはとしてGuest
、起動する唯一の方法があります。
非互換性の例
以下は、継承された2つのメソッドが@Override
同等ではない例です。
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { boolean present(); }
interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
// "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
// both define present(), but with unrelated return types"
}
これは、メンバーを継承しinterface
なければならないことは、メンバー宣言の一般的なルールに従う必要があることをさらに繰り返します。ここでは、持っているGift
とGuest
定義しpresent()
、互換性のない戻り値の型と:1 void
他boolean
。void present()
とboolean present()
を1つの型に入れることができないのと同じ理由で、この例ではコンパイルエラーが発生します。
概要
@Override
メソッドのオーバーライドと非表示の通常の要件に従って、同等のメソッドを継承できます。彼らは以来ARE @Override
換算、効果的に実施するための唯一の方法があるので、から選択/区別するものは何もありません。
コンパイラーは、どのメソッドがどのインターフェースに対応するものであるかを識別する必要はありません。これは@Override
、それらが同等であると判断されると、同じメソッドになるためです。
潜在的な非互換性を解決するのは難しい作業ですが、それはまったく別の問題です。
参考文献