关于java:错误:通用数组创建

Error: Generic Array Creation

本问题已经有最佳答案,请猛点这里访问。

我不理解一般数组创建的错误。首先,我尝试了以下方法:

1
2
3
4
5
6
7
8
  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;
}

然后我试着这样做:

1
PCB[] res = new PCB[100];

我一定错过了什么,因为这似乎是对的。我试着查了一下,真的查到了。什么都没有。

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

错误是:

1
2
3
4
5
6
7
.\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


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

创建一个显式类型的数组,如Object[]。如果你愿意的话,你可以把这个投射到PCB[]上,但在大多数情况下我不推荐。

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

如果需要类型安全性,请使用像java.util.List这样的集合,而不是数组。

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


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

1
2
3
4
5
6
7
8
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;  
}

在我对柯克·沃尔(KirkWoll)将其作为复制品联系起来的问题的回答中,对这一工作方式进行了深入的解释。


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

这是像ArrayList.toArray(T[])这样的方法的实现方式。我建议你看一下那个方法以获得灵感。更好的是,正如其他人所指出的,您可能无论如何都应该使用这种方法。