Eclipse说:Type safety: Unchecked cast from Object to ObjectArrayList<Car>
当我这样做时:
final ObjectArrayList<Car> icars = (ObjectArrayList<Car>) cars[i];
其中cars
定义为:
final Object[] cars = new Object[1000];
for (int i = 0; i < 1000; i++) {
cars[i] = new ObjectArrayList<Car>();
}
Eclipse建议将@SuppressWarnings("unchecked")
添加到icars
对象。但是我已经在某处读过注释在Java中被弃用了,所以我应该保留原样吗?
答案 0 :(得分:6)
警告只是警告您,cars
数组中正在进行转换的对象不能保证为ObjectArrayList<Car>
。
事实证明,Java不允许使用泛型类型进行数组声明,除非它们无限制(请参阅Java 1.6: Creating an array of List或此错误报告6229728 : Allow special cases of generic array creation)。但如果你能声明这样的数组,你就不会得到警告:
final ObjectArrayList<Car>[] cars=new ObjectArrayList<Car>[1000]; // not allowed
如果你真的想要避免未经检查的强制转换,你应该使用强类型集合而不是数组(例如,List<ObjectArrayList<Car>>
)。
@SuppressWarnings("unchecked")
注释只会告诉编译器不要显示警告。除非警告真的让你烦恼,否则我不建议使用它。现实是你将进行未经检查的演员表(如果您确定数组中元素的类型,则不是问题。)
作为旁注,注释在Java中不以任何方式弃用。实际上,似乎它们将在Java 8中变得更强大(似乎它们将支持JSR 308: Annotations on Java Types)。也许你读过@Deprecated
是一个注释。
答案 1 :(得分:0)
您将汽车定义为:Object[] cars
所以当您尝试将汽车元素放入icars时,您将从Object
投射到ObjectArrayList<Car>
。
编译器无法知道cars数组中的所有元素是否为ObjectArrayList<Car>
,因此它显示警告
要避免这种情况,您可以将汽车数组定义更改为:
final ObjectArrayList<Car>[] cars = new ObjectArrayList<Car>[1000];
击> <击> 撞击>
答案 2 :(得分:0)
如果您无法将Object[] cars
更改为ObjectArrayList<Car>[]
数组,那么请保持原样。编译器只会给你一个警告。当你知道你可以强制转换时,你就不必听取编译器所说的内容。
如果您发现警告令人讨厌,那么您可以添加@SuppressWarnings("unchecked")
。