有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java通用数组运行时初始化错误

我已创建泛型数组,但构造函数无法初始化数组。当运行时程序抛出此异常时

 Exception in thread "main" java.lang.RuntimeException:
 Uncompilable source code - generic array creation

如何正确初始化泛型数组

class MyList<K,V>{
    K[] k;
    V[] v;
public MyList() {
    k = new K[0];
    v = new V[0];
}

public void add(K key, V val){
    Object[] ob1 = new Object[k.length+1];
    Object[] ob2 = new Object[v.length+1];

    for (int i = 0; i < k.length; i++) {
        ob1[i]=k[i];
        ob2[i]=v[i];
    }
    ob1[k.length]=key;
    ob2[v.length]=val;

    k=(K[]) ob1;
    v=(V[]) ob2;
}

public static void main(String[] args) {
    MyList<Integer,Double> values = new MyList<>();
    values.add(1,0.5);
}
}

为什么会发生这种情况,有解决办法吗


共 (2) 个答案

  1. # 1 楼答案

    您可以使用这个构造函数

    public MyList(K[] k, V[] v) {
        this.k = k;
        this.v = v;
    }
    
    
    public static void main(String[] args) {
        MyList<Integer,Double> values = new MyList<>(new Integer[0], new Double[0]);
        values.add(1,0.5);
    }
    

    这会奏效的

  2. # 2 楼答案

    数组是可重新定义的类型,这意味着应该在运行时维护这些类型信息

     k = new K[0];
     v = new V[0];
    

    这里,由于KV是泛型参数,因此类型擦除将启动并将它们擦除到Object

    Array类中使用newInstance()方法来创建泛型数组