错误:创建通用数组

2022-08-31 23:41:08

我不明白通用数组创建的错误。
首先,我尝试了以下方法:

  public PCB[] getAll() {
       PCB[] res = new PCB[list.size()];
           for (int i = 0; i < res.length; i++) {
               res[i] = list.get(i);
            }
       list.clear();
       return res;
}


然后我尝试这样做:

PCB[] res = new PCB[100];


我一定错过了一些似乎正确的原因。我试着查了一下,我真的做到了。而且没有任何东西在咔哒一声。


我的问题是:我能做些什么来解决这个问题?


错误是:

.\Queue.java:26: generic array creation
PCB[] res = new PCB[200];
            ^
Note: U:\Senior Year\CS451- file      
uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

工具已完成,退出代码为 1


答案 1

不能使用泛型组件类型创建数组。

而是创建一个显式类型的数组,如 。然后,如果您愿意,可以将其转换为,但在大多数情况下,我不建议这样做。Object[]PCB[]

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */

如果需要类型安全,请使用类似集合而不是数组。java.util.List<PCB>

顺便说一句,如果已经是 ,则应使用其方法之一,而不是在代码中复制它们。但是,这并不能解决类型安全问题。listjava.util.ListtoArray()


答案 2

下面将为您提供所需类型的数组,同时保持类型安全性。

PCB[] getAll(Class<PCB[]> arrayType) {  
    PCB[] res = arrayType.cast(java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size()));  
    for (int i = 0; i < res.length; i++)  {  
        res[i] = list.get(i);  
    }  
    list.clear();  
    return res;  
}

这是如何工作的,在我回答柯克·沃尔(Kirk Woll)作为重复链接的问题时,对此进行了深入的解释。