我正在阅读Java教程中对泛型的限制,特别是casting with parameterized types。我理解提供的示例。但是,我不确定以下示例:
List<? extends Number> l1 = new ArrayList<Integer>();
// unchecked cast warning
ArrayList<Number> l2 = (ArrayList<Number>) l1;
// no unchecked cast warning
ArrayList<? extends Number> l3 = (ArrayList<? extends Number>) l1;
我理解为什么在第一种情况下会出现警告。为什么第二种情况没有警告?是因为我可以在l3
上执行的唯一操作是安全的(例如,我无法在列表中添加(比方说)Float
)吗?
更新:以下摘自section 5.5.2 of the JLS,解决类似问题。
取消选中从类型
S
到参数化类型(§4.5)T
的强制转换 除非至少满足下列条件之一:
S <: T
T
的所有类型参数(第4.5.1节)都是无界通配符T <: S
和S
除了X
之外没有T
,其中X
的类型参数不包含在{{1}的类型参数中}}。
答案 0 :(得分:2)
没有警告,因为强制转换不会更改该类型的通用部分。 random_impl
和List<? extends Number>
具有相同的类型参数。相反,演员阵营是从ArrayList<? extends Number>
到List
的经过检验的演员。