Thật khó để giải thích bằng lời, nhưng Java Generics được cho tôi một kết quả bất ngờ. Tôi hy vọng rằng nếu tôi nói một danh sách là loại ? extends Object
, tôi có thể lưu trữ bất cứ điều gì trong đó. Do đó, nếu danh sách loại Wrapper<? extends Object>
, tôi có thể lưu trữ bất kỳ loại Trình bao bọc nào trong đó. Và cứ thế. Điều đó có ý nghĩa với tôi. Nhưng chúng ta hãy giả sử chúng ta có:Java generics hành vi kỳ lạ
private static class Wrapper<T> {
public Wrapper(T t) { /**/ }
}
Và tôi muốn một cái gì đó như:
private static final List<Wrapper<Wrapper<? extends Object>>> ls1 = new ArrayList<>();
Lưu ý rằng điều này mang lại cho tôi một lỗi:
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>>
}
Nhưng nếu tôi quấn Wrapper trong một thứ Wrapper (rs), sau đó:
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
}
Lưu ý rằng đó là điều tương tự; điều này không có ý nghĩa với tôi.
PS. Trong trường hợp của tôi, tôi không làm cho một wrapper wrapper, nhưng một ThreadLocal của một lớp chung chung.
Vì vậy, những gì bạn thực sự muốn là 'Danh sách >> '? –
Kayaman
@Kayaman Vâng, nhưng sau đó tôi không thể lưu một Danh sách> trong đó. Tôi muốn có thể lưu trữ bất kỳ loại Wrapper nào >. –
Bạn có thể thay đổi ví dụ của bạn thành một cái gì đó cụ thể, như 'String' như trong bình luận của bạn? Nó ném tôi ra để xem một tờ khai tham chiếu kiểu 'T'. – Zircon