在某些Java泛型转换中,类型安全警告的含义是什么?


76

Java警告的含义是什么?

类型安全性:从Object到List <Integer>的强制转换实际上是针对擦除的List类型进行的

当我尝试将Object强制转换为具有通用信息的类型时,会收到此警告,例如以下代码:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;

1
如果要消除Eclipse中的黄色下划线,但又不想添加@SuppressWarning,则可以选择忽略首选项中的警告。在首选项窗口中,转到Java>编译器>错误/警告,然后在“通用类型”部分下,将未选中的通用类型操作选项更改为忽略
Axel 2013年

Answers:


53

出现此警告是因为Java在运行时实际上并未在使用泛型的对象中存储类型信息。因此,如果object实际上是a List<String>,则ClassCastException在运行时将没有任何内容,除非直到从列表中访问的项目与变量中定义的通用类型不匹配为止。

如果使用不正确的通用类型信息将项目添加到列表,则可能导致进一步的复杂性。现在,仍然保留对列表的引用但具有正确的泛型类型信息的任何代码现在将具有不一致的列表。

要删除警告,请尝试:

List<?> list = (List<?>) object;

但是,请注意,由于编译器不知道您是否尝试添加错误类型的对象,因此您将无法使用诸如add之类的某些方法。上面的方法在很多情况下都可以使用,但是如果您必须使用add或类似的受限制方法,则只需在Eclipse(或SuppressWarning批注)中使用黄色下划线即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.