言葉で説明するのは難しいですが、Java Genericsは私に予期しない結果を与えています。私は、リストがタイプ? extends Object
であると言うと、そこに何かを格納することができると思いました。したがって、タイプWrapper<? extends Object>
のリストの場合は、そこに任意の種類のWrapperを格納できます。等々。それは私には意味がある。Java generics奇妙な動作
private static class Wrapper<T> {
public Wrapper(T t) { /**/ }
}
そして、私は何かしたい:これは私にエラーを与えること
private static final List<Wrapper<Wrapper<? extends Object>>> ls1 = new ArrayList<>();
を注:しかし、我々は持っていると仮定しましょう
public static <T> doit(T t) {
Wrapper<Wrapper<T>> l1 = new Wrapper<>(new Wrapper<>(t));
ls1.add(l1); // nok
// add (Wrapper<Wrapper<? extends java.lang.Object>>) in List
// cannot be applied to (Wrapper<Wrapper<T>>
}
をしかし、私は、二次でラッパーをラップする場合ラッパー(rs)、次に:
private static class C<T> extends Wrapper<Wrapper<T>> {
public C(T t) {
super(new Wrapper<>(t));
}
}
private static final List<C<? extends Object>> ls2 = new ArrayList<>();
public static <T> doit(T t) {
ls2.add(new C<>(t)); // ok
}
それは同じことであることに注意してください。これは私には意味がありません。
PS。私の場合は、ラッパーラッパーを作成するのではなく、ジェネリッククラスのThreadLocalを作成します。
だからあなたが本当に欲しいものリスト '<ラッパー<ラッパー
@Kayamanはい、でもリスト>をそこに保存することはできません。私はWrapper >のどんな種類も保存できるようにしたい。 –
あなたのコメントを 'String'のように具体的なものに変更できますか?これは、 'T'型の参照宣言を見るために私を捨ててしまいます。 – Zircon