次のコードを検討してください。
public interface A {
public A another();
}
public interface B {
public B another();
}
public interface AB extends A,B {
public AB another();
}
これにより、 でコンパイル エラーが発生しますAB
。
タイプ B と A は互換性がありません。どちらも another() を定義していますが、戻り値の型は無関係です
私はこのSOの質問を見て、受け入れられた回答の非互換性の例に従ってください-つまり
public interface C {
public void doSomething();
}
public interface D {
public boolean doSomething();
}
public interface CD extends C,D {
}
ただし、その場合、戻り値の型はまったく互換性がありませんでした。戻り値の型は void とブール値の両方にすることはできません。一方、上記の例では、 のanother()
戻り値の型AB
は anA
と a の両方B
であるため、両方の拡張インターフェイスを実装できます。
さらに、JLS (8.4.8、8.4.8.3、8.4.8.4) を見ても、上記の例が違法である理由がよくわかりません。誰かが私にこれを説明できますか?
A
第二に、またはB
の契約要件を繰り返す以外に、これに対する解決策/回避策はありますAB
か?