[英]Fully qualified generics type casting error overlooked by Java compiler?
眾所周知,泛型意味着在編譯時進行更強大的類型檢查。 但是,在研究官方Java教程時,我遇到了這個問題:
However, in some cases the compiler knows that a type parameter is always valid and allows the cast. For example:
List<String> l1 = ...;
ArrayList<String> l2 = (ArrayList<String>)l1; // OK
來自http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast 。
我已經嘗試並測試了這一點(它完全反映了文檔):
List<String> l1 = new LinkedList<String>();
ArrayList<String> l2 = (ArrayList<String>)l1; // OK
盡管一切都非常明確(沒有分配給Object
變量,沒有使用通配符等),但是編譯器無法預測隨后出現的運行時錯誤:
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList cannot be cast to java.util.ArrayList
100%不解。
重新讀取鏈接-並不是說您可以將LinkedList
轉換為ArrayList
。 它說明您可以向下轉換一個List
的String
到(大概是程序員知道)類型的ArrayList
的String
。 他們試圖說明的是通用類型參數之間的差異。 他們的第一個示例顯示了從Integer
集合到Number
集合的強制轉換。
通常,除非使用不受限制的通配符對其進行參數化,否則無法將其轉換為參數化類型。 例如:
列表li = new ArrayList <>(); 列表ln =(列表)li; //編譯時錯誤
但是,在某些情況下,編譯器知道類型參數始終有效並允許強制轉換。 例如:
列表l1 = ...; ArrayList l2 =(ArrayList)l1; // 好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.