为什么这段代码可以编译
final ArrayList<?> dp1 = new ArrayList<String>();
但这并不
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
理解起来相当复杂,但总而言之,在您的第一个代码中,String
extends?
但第二个代码无法编译,因为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>
。
您可以在此处阅读有关参数化类型中的超级/子集/类型的规则。