簡體   English   中英

為什么從對象轉換為無界通配符集時沒有警告?

[英]Why there is no warning while casting from object to unbounded wildcard collection?

為什么以下代碼沒有警告?

public void some(Object a){
    Map<?, ?> map = **(Map<?,?>)a**;  //converting unknown object to map    
}

我預計RHS會有一個未經檢查的警告。

雖然此代碼有警告:

public void some(Object a){
   Map<Object, Object> map = **(Map<Object,Object>)a**;
  //converting unknown object to Map<Object,Object>      
}

此外,對於以下情況,沒有警告:

String str = (String) request.getAttribute("asd") //returns Object

這是否意味着仿制葯帶來了未經檢查的警告? 在Java中引入泛型之前沒有這樣的警告?

是的,未經檢查的警告僅與通用類型相關。

這意味着:從Object到Map<T1, T2>可能會成功,因為該對象確實是一個Map,但由於類型擦除,運行時無法檢查它是否為Map<T1, T2> 它可能很適合Map<T3, T4> 因此,您可以通過在內部放置T1,T2元素來破壞映射的類型安全性,或者在嘗試從映射中讀取值時獲取ClassCastException。

你沒有警告第一次投射,因為你正在轉換為Map<?, ?> ,這意味着鍵和值類型是未知的,這是真的。 如果沒有額外的強制轉換,你將無法在這樣的地圖上執行類型不安全的操作:你不能向這樣的地圖添加任何東西,你唯一可以得到的就是Object實例。

你沒有得到“未經檢查”的警告,因為強制轉換被“檢查” - 對Map<?,?>強制轉換只需要確保對象是Map (沒有別的),並且在運行時完全可以檢查。 換句話說, Map<?,?>是可再生類型。

暫無
暫無

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

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