在Java中未经检查的强制转换警告

时间:2013-05-02 09:45:27

标签: java casting warnings

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中被弃用了,所以我应该保留原样吗?

3 个答案:

答案 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")