我有一個 GenericList 類,它必須用型別初始化一個陣列,但它迫使我在編譯時將其宣告為 Object。當我在 Main 中將泛型宣告為 String 時,當我將 list.items 分配給名為 items 的變數時,程式會因 ClassCastException 而停止,該變數在編譯時也將其識別為 String[]。錯誤是這樣的:
Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
at com.advanced.Main.main(Main.java:51)".
為什么以及如何解決這個問題?謝謝你。
public class GenericList<T> {
public T[] items = (T[]) new Object[10];
private int count;
public void add(T item){
items[count ] = item;
}
public T get(int index){
return items[index];
}
public T[] getItems() {
return items;
}
}
public class Main {
public static void main(String[] args) {
var list = new GenericList<String>();
list.add("a");
list.add("b");
var items = list.items;
for(var item: items){
System.out.println(item);
}
}
}
uj5u.com熱心網友回復:
您必須顯式注入T型別的陣列建構式。
例如移動你new T[10]的
static class GenericList<T> {
final public T[] items;
private int count;
public GenericList(IntFunction<T[]> arrayConstructor) {
items = arrayConstructor.apply(10);
}
并創建注入建構式的物件
var list = new GenericList<>(String []::new);
現在一切正常
a
b
null
null
null
null
null
null
null
null
(注意:T[] items = (T[]) new Object[10]您不是在創建T陣列,而是在創建Object陣列轉換為T陣列,這是不正確的)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313107.html
標籤:爪哇
