Trudno wyjaśnić słowami, ale Java Generics ma dla mnie nieoczekiwany efekt. Spodziewałem się, że jeśli powiem, że lista jest typu ? extends Object
, mogę przechowywać wszystko tam. Dlatego też, jeśli lista typu Wrapper<? extends Object>
, mogę przechowywać tam wszelkiego rodzaju Wrapper. I tak dalej. Ma to sens dla mnie. Ale załóżmy, że mamy:Jawne generyczne dziwaczne zachowanie
private static class Wrapper<T> {
public Wrapper(T t) { /**/ }
}
I chcę coś takiego:
private static final List<Wrapper<Wrapper<? extends Object>>> ls1 = new ArrayList<>();
Zauważ, że to daje mi błąd:
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>>
}
ale gdybym owinąć owijki w drugorzędnym Wrapper (rs), a następnie:
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
}
Zauważ, że to jest to samo; to nie ma dla mnie sensu.
PS. W moim przypadku nie robię wrappera, ale ThreadLocal klasy ogólnej.
Więc co naprawdę chcesz to 'List >>'? –
Kayaman
@Kayaman Tak, ale nie mogę tam przechowywać Listy>. Chcę móc przechowywać dowolnego rodzaju Wrapper >. –
Czy możesz zmienić swój przykład na konkretny, np. "Ciąg", jak w swoim komentarzu? Rzuca mi to, aby zobaczyć deklarację referencyjną typu "T". – Zircon