为什么这段代码会编译
final ArrayList<?> dp1 = new ArrayList<String>();
但这不是
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
答案 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中阅读有关超级/子集/类型的规则。