2

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不推荐使用注释,所以我应该保持原样吗?

4

3 回答 3

6

警告只是警告您,cars数组中正在转换的对象不能保证是ObjectArrayList<Car>.

事实证明,Java 不允许使用泛型类型声明数组,除非它们是无界的(请参阅Java 1.6:创建 List 数组,或此错误报告6229728:允许创建泛型数组的特殊情况)。但是,如果您可以像这样声明数组,您将不会收到警告:

final ObjectArrayList<Car>[] cars=new ObjectArrayList<Car>[1000]; // not allowed

如果您真的想避免未经检查的强制转换,您应该使用强类型集合而不是数组(例如, a List<ObjectArrayList<Car>>)。

@SuppressWarnings("unchecked")注释只会告诉编译器不要显示警告。除非警告真的让你烦恼,否则我不会建议使用它。现实情况是您将进行未经检查的强制转换(如果您确定数组中元素的类型,这不是问题)。

附带说明一下,Java 中并没有以任何方式弃用注解。实际上,Java 8 似乎它们会变得更强大(似乎它们会支持JSR 308: Annotations on Java Types)。也许您读到的@Deprecated是注释。

于 2013-05-02T09:48:31.710 回答
0

您将汽车定义为:Object[] cars因此,当您尝试将汽车元素放入 icars 时,您正在从Objectto投射ObjectArrayList<Car>

编译器无法知道汽车数组中的所有元素是否都是ObjectArrayList<Car>,因此会显示警告

为避免这种情况,您可以将 cars 数组定义更改为:

final ObjectArrayList<Car>[] cars = new ObjectArrayList<Car>[1000];

于 2013-05-02T09:49:44.467 回答
0

如果您不能将 更改为Object[] cars数组 ObjectArrayList<Car>[],那么可以,保持原样。编译器只会给你一个警告。当你知道你可以强制转换时,你就不必听编译器说什么了。

如果您发现警告烦人,那么可以添加@SuppressWarnings("unchecked").

于 2013-05-02T09:52:50.403 回答