[英]Unchecked cast warnings with parameterized types
我正在從Java教程中閱讀有關泛型的限制,特別是使用參數化類型進行強制轉換 。 我了解所提供的示例。 但是,我不確定以下示例:
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
添加(例如)到列表中)?
更新:以下是JLS的5.5.2節的節錄,該節解決了類似的問題。
除非滿足以下至少一項,否則不檢查從類型
S
到參數化類型(第4.5節)T
的強制轉換:
S <: T
- 所有的類型參數(§4.5.1)
T
是無界的通配符T <: S
和S
沒有亞型X
比其他T
其中的類型參數X
未包含在類型參數T
。
沒有任何警告,因為強制轉換不會更改類型的通用部分。 List<? extends Number>
List<? extends Number>
和ArrayList<? extends Number>
ArrayList<? extends Number>
具有相同的類型參數。 相反,該轉換是從List
到ArrayList
的選中轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.