为什么ArrayList <arraylist <?>&gt; list = new ArrayList <arraylist <string>&gt;()不能编译?</arraylist <string> </arraylist <?>

时间:2013-05-24 14:21:38

标签: java generics

为什么这段代码会编译

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

但这不是

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

2 个答案:

答案 0 :(得分:6)

理解起来相当复杂,但总结在第一个代码中,String扩展?但第二个不编译,因为ArrayList<String>不直接从{{1}继承如果你想要所有的细节,你可以看here。 如果您想要编译第二个示例,则必须将其修改为:

ArrayList<?>

答案 1 :(得分:6)

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>的超类型。

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