使用参数化类型

时间:2017-06-04 19:48:48

标签: java generics casting warnings unchecked

我正在阅读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 <: SS除了X之外没有T,其中X的类型参数不包含在{{1}的类型参数中}}。
  •   

1 个答案:

答案 0 :(得分:2)

没有警告,因为强制转换不会更改该类型的通用部分。 random_implList<? extends Number>具有相同的类型参数。相反,演员阵营是从ArrayList<? extends Number>List的经过检验的演员。