Java には C# の に相当するものはありpublic void A.show()
ません。これは、インターフェイスがそのように競合しないようにするためです。同じ名前と同じ引数の型を持つメソッドを宣言する 2 つのインターフェイスを実装する場合、それらの戻り値の型も同じであるか、Java はコードをコンパイルすることさえできません。また、戻り値の型も同じになると、署名が両方のインターフェイスの要件を満たすため、どちらか一方を実装するクラスは実際には両方を同時に実装します。
もちろん、確認したい場合は...
public class Example {
interface A { public void show(); }
interface B { public void show(); }
class C implements A, B {
public void show() { System.out.println("show()ing"); }
}
public static void main(String[] args) {
C c = new C();
A a = c;
a.show(); // does something, trust me :P
B b = c;
b.show(); // does something too
}
}
C
は両方のvoid show()
インターフェースのメソッド宣言を満たしているので、すべて問題なく、コンソールに 2 つの行が表示されます (1 つは A 参照による呼び出し用、もう 1 つは B 呼び出し用)。
今、あなたが持っていたとしましょう
interface A { public void show(); }
interface B { public int show(); } <-- different return type!
class C implements A, B { public void show(); }
どのメソッドを実装しようとしているのかは、ある程度明らかです。ただし、これは機能しません。Java では 2 つのインターフェイスのメソッドが同じクラスに存在することを許可しないため、機能しません。
さて、最後の例です。
interface A { public void show(); }
interface B { public int show(int); } <-- different return type!
class C implements A, B {
public void show() { System.out.println("Showing..."); }
public int show(int i) { System.out.println(i); }
}
これで十分です。2 つのインターフェイス宣言は名前のみを共有し、arg 型を共有しないため、Java はそれらを で共存させますC
。ただし、インターフェイスごとに 1 つのメソッドを実装する必要もあります。