11

为什么这段代码可以编译

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

但这并不

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

2 回答 2

6

理解起来相当复杂,但总而言之,在您的第一个代码中,Stringextends?但第二个代码无法编译,因为ArrayList<String>不直接从您那里继承,如果您想要所有详细信息ArrayList<?>,可以查看此处。如果要编译第二个示例,则必须将其修改为:

final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
于 2013-05-24T14:38:57.390 回答
6

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

type 参数?是一个通配符,它​​是 的超集(不是超类型)String。所以,ArrayList<?>是超类型的ArrayList<String>

但在

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

类型参数ArrayList<?>(一个参数化类型,?只代表一些未知类型,与 没有任何关系String)不是通配符,通配​​符是? extends ArrayList<?>,具有上限ArrayList<?>,实际上是 的超类型ArrayList<String>

您可以在此处阅读有关参数化类型中的超级/子集/类型的规则。

于 2013-05-24T14:39:47.107 回答