簡體   English   中英

帶有參數化類型的未經檢查的轉換警告

[英]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 <: SS沒有亞型X比其他T其中的類型參數X未包含在類型參數T

沒有任何警告,因為強制轉換不會更改類型的通用部分。 List<? extends Number> List<? extends Number>ArrayList<? extends Number> ArrayList<? extends Number>具有相同的類型參數。 相反,該轉換是從ListArrayList的選中轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM