Java泛型奇怪的行为

Lua*_*ico 6 java generics

用语言来解释很难,但是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.

Loc*_*Loc 2

我认为

? 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)