gpt4 book ai didi

java - 不兼容的类型 : ArrayList> cannot be converted to ArrayList>

转载 作者:行者123 更新时间:2023-12-02 11:50:43 26 4
gpt4 key购买 nike

以下代码产生错误:

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.java:10: error: incompatible types: ArrayList<C<CAP#1>> cannot be converted to ArrayList<C<?>>
ArrayList<C<?>> l = o.lst;
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?

它说类型不同,但如果我替换?对于T,那么它变成ArrayList<C<T>>与列表 l 的类型相同。

我的推理有什么问题吗?

最佳答案

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

你的问题是通过这样声明l:

ArrayList<C<?>> l

您可以在以下位置添加任何 C 实例:

l.add(new C<String>());
l.add(new C<Integer>());

通过将 o.lst 分配给 l,您可以在 o.lst 中添加任何内容,无论其声明的泛型如何。

所以编译器不接受这个赋值:

ArrayList<C<?>> l = o.lst;

如果你现在写:

ArrayList<?> l = o.lst;

没关系,因为 l 不允许添加任何内容,但 null 除外。

关于java - 不兼容的类型 : ArrayList<C<CAP#1>> cannot be converted to ArrayList<C<? >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890047/

26 4 0