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
- 你能发布异常/错误吗
- 我假设EDCOX1 0是一个泛型类型的参数,因此,由于类型擦除,在Java中所做的是不可能的。如果这都是真的,你应该点击我标记的链接,因为它提供了一个解决方法。
- 已经尝试阅读那篇文章了。这对我没有帮助
- 令人悲哀的事实是,Java作出了明确的决定,明确地阻止这种语法的工作。Java实现类型擦除,这意味着类型参数EDCOX1(0)实际上在运行时没有意义(或者在技术上,它确实是,但它可能只是EDOCX1,2),这对你没有任何好处。有两种方法可以绕过这一限制。在我引用的链接中详细解释了这两个问题。请告诉我您在解决方案中遇到的具体问题。
- 我也面临同样的问题。PCB不可能是一个泛型类(我认为它是一个内部类),但是Java认为它是通用的。有人知道怎么修这个吗?
- PCB <?>[]Res=新的PCB<?>[100];是可能的
不能使用通用组件类型创建数组。
创建一个显式类型的数组,如Object[]。如果你愿意的话,你可以把这个投射到PCB[]上,但在大多数情况下我不推荐。
1
| PCB [] res = (PCB []) new Object[list. size()]; /* Not type-safe. */ |
如果需要类型安全性,请使用像java.util.List这样的集合,而不是数组。
顺便说一下,如果list已经是java.util.List了,您应该使用它的toArray()方法之一,而不是在代码中复制它们。但这并不能解决类型安全问题。
- 是的,但当您将其返回到外部时,调用方将其分配给一个类型为pcb[]的变量。Boom您将获得类强制转换异常
- @纽阿克特-那不一定会发生。这取决于调用上下文。但这是有可能发生的。这就是我所说的"不类型安全"的意思,也是我反对它的原因。
- @埃里克森:随着递归的展开,它最终会在某个时刻发生。仿制药总是在某个时刻变得具体化,否则就不会有任何工作完成。唯一合理工作的方法是,如果结果从未实际用作实际类型的PCB的数组。在这种情况下,最好声明自己返回了一个Object[]。
- @mark peters-不,在很多情况下,您都知道结果数组不会"转义"到一个上下文,在这个上下文中,它被用作除Object[]之外的任何东西。但是,当然,最好不要试图将角类仿制药放入一个数组中。
- @埃里克森:没错,既然是这样,那就返回一个Object[],因为它是类型安全的,根本不限制使用。任何将结果作为除Object[]以外的任何东西使用的用法基本上都保证会引发运行时错误,那么为什么还要麻烦您返回其他东西呢?
- @马克·彼得斯-我不会。这就是为什么我建议用List代替。但我将其作为对OP明确问题的直接回应。
- @实际上,埃里克森,我发现了一个用法示例,它并不十分愚蠢。如果泛型数组仍然封装在一个集合(例如arraylist)中,那么对数组的访问和对数组的访问将单独通过泛型执行,并且可以正常工作。没有考虑把它作为一个实例变量。
下面将为您提供所需类型的数组,同时保留类型安全性。
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[])这样的方法的实现方式。我建议你看一下那个方法以获得灵感。更好的是,正如其他人所指出的,您可能无论如何都应该使用这种方法。