为什么 ArrayList<ArrayList<?>> list = new ArrayList<ArrayList<String>>() 不能编译?

11

为什么这段代码可以编译通过

final ArrayList<?> dp1 = new ArrayList<String>();

但是这并不

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

6
请查看:https://dev59.com/PHRC5IYBdhLWcg3wAcQ3 - DHall
1
“为什么”有点复杂。但是,这段代码可以编译:final ArrayList<? extends List<?>> dp2 = new ArrayList<ArrayList<String>>(); - Sheldon Warkentin
2个回答

6
这很复杂,但概括起来,在您的第一个代码中,String 继承自 ? ,但第二个代码由于 ArrayList<String> 不直接继承自 ArrayList<?> 而无法编译通过。如果您想了解更多详细信息,可以在这里查看:这里。 如果您希望您的第二个示例编译通过,则必须将其修改为此形式:
final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

这是否意味着 - 如果我有class P {}class C extends P {},那么我就可以执行ArrayList <P> a = new ArrayList <C>(); - Bhesh Gurung

6

In

final ArrayList<?> dp1 = new ArrayList<String>();

类型参数 ? 是一个通配符,它是 String 的超集(而非父类)。因此,ArrayList<?>ArrayList<String> 的超类型。

但在

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

类型参数ArrayList<?>(一个参数化类型,其中?只代表某种未知类型,与String无关)不是通配符,通配符应该是? extends ArrayList<?>,具有上限ArrayList<?>,实际上是ArrayList<String>的超类型。您可以在此处阅读有关参数化类型中超/子集/类型规则的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接