用语言来解释很难,但是Java Generics给了我一个意想不到的结果.我希望如果我说列表是类型? extends Object,我可以在那里存储任何东西.因此,如果是类型列表Wrapper<? extends Object>,我可以在那里存储任何类型的Wrapper.等等.这对我来说很有意义.但我们假设我们有:
private static class Wrapper<T> {
public Wrapper(T t) { /**/ }
}
Run Code Online (Sandbox Code Playgroud)
我想要的东西是这样的:
private static final List<Wrapper<Wrapper<? extends Object>>> ls1 = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
请注意,这给了我一个错误:
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>>
}
Run Code Online (Sandbox Code Playgroud)
但是如果我将Wrapper包装在辅助包装器(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
}
Run Code Online (Sandbox Code Playgroud)
请注意,它是一样的; 这对我没有意义.
PS.在我的例子中,我不是创建一个包装器包装器,而是一个泛型类的ThreadLocal.
我认为
? extends Object ---> equals ?
Run Code Online (Sandbox Code Playgroud)
你可以这样做
List<Wrapper<Wrapper<?>>> ls1 = new ArrayList<>();
And
Wrapper<Wrapper<?>> l1 = new Wrapper<>(new Wrapper<>(t));
ls1.add(l1); // OK
Run Code Online (Sandbox Code Playgroud)