Java 不兼容类型:ArrayList<;C<;第1章>&燃气轮机;无法转换为ArrayList<;C<&燃气轮机&燃气轮机;

Java 不兼容类型:ArrayList<;C<;第1章>&燃气轮机;无法转换为ArrayList<;C<&燃气轮机&燃气轮机;,java,generics,compiler-errors,Java,Generics,Compiler Errors,以下代码产生错误: class A { public static class C<T> { public ArrayList<C<T>> lst; } public void main(String[] args) { C<?> o = new C<>(); ArrayList<C<?>> l = o.lst; } } A类{

以下代码产生错误:

class A {
    public static class C<T> {
        public ArrayList<C<T>> lst;
    }

    public void main(String[] args) {
        C<?> o = new C<>();
        ArrayList<C<?>> l = o.lst;
    }
}
A类{
公共静态C类{
公共阵列列表lst;
}
公共void main(字符串[]参数){
C o=新的C();
ArrayList>

ArrayList仅当赋值的变量目标不允许在集合中添加元素时,编译器才接受将具有泛型子类型的集合赋值给泛型集合。
防止添加与集合子类型声明的类型不匹配的泛型集合。

您的问题是通过以下方式声明
l

ArrayList<C<?>> l
通过将
o.lst
分配给
l
,您可以在
o.lst
中添加任何声明为泛型的内容

因此编译器不接受此赋值:

ArrayList<C<?>> l = o.lst;
ArrayList l=o.lst;
可以,因为
l
不允许任何添加,但
null

l.add(new C<String>());
l.add(new C<Integer>());
ArrayList<C<?>> l = o.lst;
ArrayList<?> l = o.lst;