簡體   English   中英

通用和強制轉換Java規則

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

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