[英]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.