ジェネリックで次の問題を発見しました。タイプバインドで使用されるジェネリック型からの型引数へのアクセス
public <T extends A<?>> void foo(T t) {
bar(t);
}
により、ワイルドカードには、getの戻り値の型の型情報は、()不足している:のは、次のメソッドの定義を想定してみましょう、今の汎用インタフェース
public interface A<X> {
X get();
void doStuff(X x);
}
を考えてみましょう。したがって、私は新鮮な型変数にこのワイルドカードを「結合する」は、他のメソッドに委譲する必要があります。
FOOにあるバー()の呼び出しが許可されていない
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
は、コンパイラは、次のエラーメッセージを出力します。
私は
にメソッドfoo()を変更した場合型式試験に
方法バー(A)は、
しかし引数(T)のために適用されません
です。どうして?これはコンパイラエラーですか?これに関するコメントは非常に高く評価されます。
注:
- 私は単純に、ボイドのfoo(A)とメソッドfooを宣言していない理由は、私が実際に上位タイプバウンドinteresection(&)を使用していますということです。
- 私がfoo()の型変数としてXを宣言しないのは、実際にクラスレベルで問題があり、このクラスの型パラメータの数を不必要に増やしたくないからです。それが動作
public class Test { public interface A<X> { X get(); void doStuff(X x); } public <T extends A<?>> void foo(T t) { bar(t); } private <X> void bar(A<X> t) { X x = t.get(); t.doStuff(x); } }
:
-Xlintコンパイラフラグを使用していますか?そうでない場合は、コンパイルを試してください。 –
何も変わりません。 – misberner
@kanに同意します。 Javaコンパイラは、実際にはこれをコンパイルします。私は1.6.0_27を使用しました。 Eclipseはあなたが与えた正確なエラーを提供しているので、おそらくそれを使用していますか? –