我已經閱讀了不同的文章,這些文章討論了為什么我們不能在 Java 中創建泛型陣列,但我仍然不太明白為什么。
例如,在這篇文章中,假設如果通用陣列初始化是可能的,則擦除后會出現轉換問題。您可以在部分2. 使用泛型陣列時的注意事項中找到詳細資訊。簡單來說,泛型陣列擦除后就變成了Object Array,如果泛型型別是String,java將無法將Object[]轉換為String[]。
但是,我用一個簡單的函式創建了一個泛型類,
// Test.java
public class Test<T> {
public T[] getStrArr(T[] arr) {
return arr;
}
}
//Main.java
public static void main(String[] args) {
Test<String> test = new Test<>();
String[] strArr = test.getStrArr(new String[]{"A", "B", "C"});
}
擦除后,getStringArr 應該回傳 Object[],并且可以毫無問題地轉換為 String[]。
另一個stackoverflow帖子指出:
陣列(與泛型不同)在運行時包含有關其組件型別的資訊。所以在創建陣列的時候一定要知道組件型別。由于您在運行時不知道 T 是什么,因此您無法創建陣列。
但是擦除會T變成Object型別,所以編譯器可以創建 Object 型別的陣列。
還有其他帖子有類似的解釋,但無法真正解決我的疑問。
請幫忙!
uj5u.com熱心網友回復:
擦除后,getStringArr 應該回傳 Object[],并且可以毫無問題地轉換為 String[]。
getStrArr型別擦除后的回傳型別將是Object[]但是,在您的代碼中,它回傳的arr是型別String[]。這就是為什么ClassCastException您的代碼中沒有的原因。
考慮以下方法(假設允許使用泛型陣列):
public T[] foo() {
return new T[5];
}
型別擦除后,new T[5]將替換為new Object[5]. 現在,如果呼叫代碼將此方法呼叫為:
String[] strArr = obj.foo();
它將導致ClassCastException因為Object[]無法轉換為String[].
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311196.html
上一篇:Gorm查找結果到介面
下一篇:增加沒有型別的陣列引數的方法
