[更新]実際の状況は、最初の質問のように思えたよりも少し複雑でした。それを反映するようにコードを少し変更しました。[/ UPDATE]
私は次の行動に少し困惑しています。次のようなコードがあるとします。
interface Inter<T> {
T makeT();
void useT(T t);
}
public class Foo {
public void bar(Qux q) {
Inter<?> x = getInterForQux(q);
x.useT(x.makeT());
}
Inter<?> getInterForQux(Qux q) {
if( someTest(q) ) {
return (Inter<Integer>) mkAnInterInt();
} else {
return (Inter<Double>) mkAnInterDouble();
}
}
}
Javacは私にエラーを与えます:
Inter <capture#478 of?>のuseT(capture#478 of?)は(java.lang.Object)に適用できません
Eclipseが私に与えるのに対して:
型Inter <capture#1-of?>のメソッドuseT(capture#1-of?)は、引数(capture#2-of?)には適用できません。
明らかに、T
結果の型が何であっても、makeT()
のパラメーターの型と同じですuseT()
。なぜこれができないのですか?回避策はありますか?
ワイルドカードを使用すると、コンパイラはの戻り値の型x.makeT()
とパラメータの型x.useT()
が同じであることを認識できません。それらが同じであることを保証するには、ここでジェネリックメソッドを使用する必要があります。
public class Foo {
public <T> void bar(Inter<T> x) {
x.useT(x.makeT());
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加