我不明白通用阵列创建的错误
首先,我尝试了以下内容:
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
答案 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作为重复链接的问题进行了深入解释。