次の 2 つのインターフェイスmethodA()
は、パラメーター (none) と戻り値の型 (int) に関して同じように定義されています。下部の実装クラスは、この正確なシグネチャを持つ単一のメソッドを定義します。両方のインターフェースに準拠しているため、問題はありません。タイプ InterfaceA または InterfaceB の参照を介して行われた呼び出しは、この実装にディスパッチされます。
2 つ目は、 in の(またはそれ自体)methodB()
の任意のサブタイプを返すものとして定義されています。のサブタイプである を返すと定義します。実装クラスは実際にメソッドを で実装するため、との両方の契約に準拠します。ここでも問題ありません。ただし、 a を返すように実装されているコメントアウトされたケースは機能しません。Number
Number
InterfaceA
InterfaceB
methodB()
Integer
Number
Integer
InterfaceA
InterfaceB
methodB()
Double
InterfaceA
InterfaceB
Integer
InterfaceA
とが(例ではコメントアウトされているInterfaceB
) に対して (異なる) コントラクトを指定している場合、これは矛盾し、コンパイラ エラーが発生します。methodC()
両方の署名 (戻り値の型のみが異なる) を実装することは、Java では許可されていません。
上記の規則は、メソッドにパラメーターを追加する場合にも当てはまります。簡単にするために、これを例から除外しました。
public interface InterfaceA {
public int methodA();
public Number methodB();
// public int methodC(); // conflicting return type
}
public interface InterfaceB {
public int methodA();
public Integer methodB();
// public String methodC(); // conflicting return type
}
public class ImplementationOfAandB implements InterfaceA, InterfaceB {
public int methodA() {
return 0;
}
public Integer methodB() {
return null;
}
// This would NOT work:
// public Double methodB() {
// return null;
// }
}