型が2つのインターフェースを実装し、それぞれinterfaceが同一のシグニチャーを持つメソッドを定義する場合、実際には1つのメソッドしかなく、それらは区別できません。たとえば、2つのメソッドの戻り値の型が競合している場合は、コンパイルエラーになります。これは、継承、メソッドのオーバーライド、非表示、宣言の一般的なルールであり、2つの継承されたinterfaceメソッド間だけでなくinterface、スーパーclassメソッドとの競合、またはジェネリックの型消去による競合にも適用されます。
互換性の例
ここでは、持っている例ですinterface Giftあり、present()(提示贈り物、のような)方法を、またinterface Guestもあり、present()この方法は、(のように、ゲストが存在し、不在ではありません)。
Presentable johnnyGiftと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、それらが同等であると判断されると、同じメソッドになるためです。
潜在的な非互換性を解決するのは難しい作業ですが、それはまったく別の問題です。
参考文献