簡體   English   中英

Java編譯器忽略了完全合格的泛型類型轉換錯誤?

[英]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 它說明您可以向下轉換一個ListString到(大概是程序員知道)類型的ArrayListString 他們試圖說明的是通用類型參數之間的差異。 他們的第一個示例顯示了從Integer集合到Number集合的強制轉換。

通常,除非使用不受限制的通配符對其進行參數化,否則無法將其轉換為參數化類型。 例如:

列表li = new ArrayList <>(); 列表ln =(列表)li; //編譯時錯誤

但是,在某些情況下,編譯器知道類型參數始終有效並允許強制轉換。 例如:

列表l1 = ...; ArrayList l2 =(ArrayList)l1; // 好

暫無
暫無

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

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