あいまいなタイトルで申し訳ありません。Eclipse Juno (4.2) でコンパイルされますが、javac (1.7.0_09) ではコンパイルされない次のコードがあります。
package test;
public final class Test {
public static class N<T extends N<T>> {}
public static class R<T extends N<T>> {
public T o;
}
public <T extends N<T>> void p(final T n) {}
public void v(final R<?> r) {
p(r.o); // <-- javac fails on this line
}
}
エラーは次のとおりです。
Test.java:13: エラー: クラス Test のメソッド p は、指定された型に適用できません。 プロ); ^ 必須: T 見つかった: N<CAP#1> 理由: 推論された型が宣言された境界に準拠していません 推測: N<CAP#1> 境界: N<N<CAP#1>> ここで、T は型変数です。 T は、メソッド <T>p(T) で宣言された N<T> を拡張します。 ここで、CAP#1 は新しい型変数です: CAP#1 は、? のキャプチャから N<CAP#1> を拡張します。 1 エラー
質問は次のとおりです。
これはバグですか、
javac
それとも Eclipse のバグですか?javac
メソッドの署名を変更せずにv
(つまり、ワイルドカードを保持して) 、これを でコンパイルする方法はありますか?に変更
<T extends N<T>> void v(final R<T> r)
するとコンパイルされることは知っていますが、最初にこれを回避する方法があるかどうかを知りたいです。また、コンテンツには正確な制約が必要なタイプがあるため、メソッドp
を に変更することはできません。<T extends N<?>> void p(final T n)
T extends N<T>