错误:通用阵列创建

时间:2010-10-05 17:00:07

标签: java arrays generics class object

我不明白通用阵列创建的错误 首先,我尝试了以下内容:

  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

3 个答案:

答案 0 :(得分:40)

您无法使用通用组件类型创建数组。

创建一个显式类型的数组,例如Object[]。如果需要,您可以将其转换为PCB[],但在大多数情况下我不建议使用它。

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

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

顺便说一下,如果list已经是java.util.List,那么您应该使用其toArray()方法之一,而不是在代码中复制它们。但这并不能解决类型安全问题。

答案 1 :(得分:4)

除了“可能的重复”中提出的方法之外,解决这个问题的另一个主要方法是由调用者提供数组本身(或至少一个模板),调用者希望知道具体的类型,因此可以安全地创建数组。

这是实现ArrayList.toArray(T[])等方法的方法。我建议你看看这种方法的灵感。更好的是,你可能应该使用那种方法,正如其他人所指出的那样。

答案 2 :(得分:4)

以下内容将为您提供所需类型的数组,同时保留类型安全性。

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;  
}

如何解决这个问题在my answer中对Kirk Woll作为重复链接的问题进行了深入解释。