为什么要编译这段代码
final ArrayList<?> dp1 = new ArrayList<String>();但这不是
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();发布于 2013-05-24 22:39:47
在……里面
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中阅读有关超级/子集/类型的规则。
发布于 2013-05-24 22:38:57
这很难理解,但总而言之,在您的第一段代码中,String扩展了?,但第二段代码不能编译,因为ArrayList<String>不是直接从ArrayList<?>继承的。如果您想了解所有细节,可以查看here。如果您希望编译第二个示例,则必须将其修改为:
final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();https://stackoverflow.com/questions/16737222
复制相似问题