错误:通用阵列创建

Lur*_*ron 34 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;
}
Run Code Online (Sandbox Code Playgroud)


然后我尝试这样做:

PCB[] res = new PCB[100];
Run Code Online (Sandbox Code Playgroud)


我必须遗漏一些似乎正确的事情.我试着查一下,我真的做到了.没有任何东西在点击.


我的问题是:我该怎么做才能解决这个问题?


错误是:

.\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
Run Code Online (Sandbox Code Playgroud)

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

eri*_*son 40

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

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

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的但是当你将它返回到外面时,调用者将其分配给PCB []类型的变量.繁荣你将得到一个阶级演员例外 (3认同)
  • @erickson:随着递归的展开,它最终会在某个时刻发生.泛型在某些时候总是变得具体,否则就无法完成任何工作.这种合理工作的唯一方法是,如果结果从未真正用作实际类型的"PCB"的数组.在这种情况下,将自己声明为返回`Object []`会好得多. (2认同)
  • @erickson:确切地说,既然如此,那么只返回一个`Object []`因为它是类型安全的并且不会限制****的使用.任何使用结果作为"Object []"之外的任何用法基本上都可以保证抛出一个运行时错误,那么为什么你会为了返回别的东西而烦恼呢? (2认同)
  • @erickson,实际上,我发现了一个使用示例,它不是严格的愚蠢.如果通用数组仍然封装在一个集合(例如ArrayList)中,那么仅通过泛型来执行对数组的访问,并且它可以工作.不考虑将其作为实例变量保留. (2认同)

gde*_*ohn 5

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

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;  
}
Run Code Online (Sandbox Code Playgroud)

对 Kirk Woll 链接为副本的问题的回答中深入解释了这是如何工作的。