[英]Generic and casting java rules
我已經閱讀了一些通用限制
說到類型轉換,它說我們不能對參數化類型使用類型轉換
誰能解釋在什么情況下我們可以將Object數據類型強制轉換為其子類,因為在必要時泛型會自動執行強制轉換?
假設我有以下代碼:
T[] arrayVar =(T[]) new Object[1]
//會引發編譯器警告,但仍然可以
在這種情況下為什么要使用演員表? 它不是說泛型轉換將自動完成嗎?
假設T
未定義為<T extends NotObject>
,則
T[] arrayVar =(T[]) new Object[1]// it causes a compiler warning but still okay
擦除后為
Object[] arrayVar = (Object[]) new Object[1];
具有多余的未經檢查的演員表。
這不是類型安全的。
考慮當你做的時候會發生什么
f(arrayVar)
哪里
void f(Object[] out) { out[0] = "A string"; }
如果在String
不是T
的子類時發生這種情況,則說明您存在類型安全沖突。
要解決此問題,您可以嘗試創建更特定類型的數組。 如果可以采用類型的參數
Class<T> clazz
然后您可以創建數組
T[] varArray = (T[]) Array.newInstance(clazz, 1);
這是更類型安全的,因為嘗試這樣做
out[0] = "";
例如,對Number[]
進行操作將在運行時導致ArrayStoreException
。
它不是完全(動態)類型安全的,因為T
可能是類似List<String>
的類型,並且您仍然可以將List<Number>
放入List[]
而無需使用ArrayStoreException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.