私はこのシグネチャを持つメソッドを含むインターフェースを持っています:
<P extends MergeProperty<T> & RestartApplicant> List<P> loadPropertiesFrom(T p1, T p2);
基本的には、MergeProperty
ないクラスではありません実装RestartApplicant
、そしてRestartApplicant
本当にこの問題を理解するために重要ではありません方法を含む機能のインタフェースです。
これが問題です。このインターフェイスを実装するクラスを作成すると、Javaを使用すると、次のコードをコンパイルエラーなしで実行できます。
public class MyImplementation implements MyInterfacePreviouslyDescribed {
@Override
public List<MergeProperty<MathObject>> loadPropertiesFrom(MathObject p1, MathObject p2) {
return Arrays.asList(
// some random instances of MergeProperty that do not implement RestartApplicant
);
}
}
明らかに、私はそこでの実装の制限を尊重していません。このシグネチャが与えられた場合、使用Arrays.asList(...)
して返すリストには、を実装する要素を含める必要はありませんRestartApplicant
。MergeProperty
実装しないでくださいRestartApplicant
。したがって、これはおそらくどこかにキャストエラーを引き起こすことになります。
それでも、警告が表示されます:
Type safety: The return type List<Main.MergeProperty<Main.MathObject>> for
loadPropertiesFrom(Main.MathObject, Main.MathObject) (...) needs unchecked
conversion to conform to List<Main.MergeProperty&Main.RestartApplicant> from the
type Main.Test<Main.MathObject>
私の質問は、なぜ警告しか出ないのですか?コードをコンパイルできないように思えます。何か特別な理由はありますか?
前もって感謝します。
編集
コードを少し遊んだ後、「ジェネリック宣言」をクラスレベルに移動すると、次のようになるとわかりました。
interface MyInterfacePreviouslyDescribed<T, P extends MergeProperty<T> & RestartApplicant>
ただの代わりに
interface MyInterfacePreviouslyDescribed<T>
そして明らかに
List<P> loadPropertiesFrom(T p1, T p2);
の代わりに
<P extends MergeProperty<T> & RestartApplicant> List<P> loadPropertiesFrom(T p1, T p2);
次に、以前と同じ「不正な」実装を試行すると、実際にコンパイルエラーが発生します。それはさらに奇妙に見えます...