为什么这段代码可以编译
final ArrayList<?> dp1 = new ArrayList<String>();
但这并不
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
理解起来相当复杂,但总而言之,在您的第一个代码中,Stringextends?但第二个代码无法编译,因为ArrayList<String>不直接从您那里继承,如果您想要所有详细信息ArrayList<?>,可以查看此处。如果要编译第二个示例,则必须将其修改为:
final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
在
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>。
您可以在此处阅读有关参数化类型中的超级/子集/类型的规则。