如何修复Java中未经检查的调用警告?

时间:2011-03-14 06:57:13

标签: java

这是我写的代码?

Set keys = map.keySet();
SortedSet s = new TreeSet(keys);

我得到的警告是:

warning: [unchecked] unchecked call to TreeSet(java.util.Collection<? extends E>) as a
         member of the raw type java.util.TreeSet

如何摆脱编译器警告?

2 个答案:

答案 0 :(得分:58)

理想情况下,完全开始使用泛型。您还没有显示map的类型,但理想情况下您应该能够编写类似的内容:

Set<String> keys = map.keySet();
SortedSet<String> s = new TreeSet<String>(keys);

如果map类似于Map<String, Integer>,那就是这样。

如果map本身是原始类型,则更难 - 再次,最好的解决方法是开始在整个代码库中添加泛型,摆脱原始类型。当然,如果从第三方代码返回地图,那并不总是可行的。在这种情况下,当您从原始类型转换为泛型类型(可能通过Collections.checkedCollection)时,您可能需要在一个行上禁止警告 - 但在此之后,您应该能够使用通用类型“正确”。例如:

@SuppressWarnings("unchecked") // Just for this one statement
Collection<String> keys = Collections.checkedCollection(map.keySet(),
                                                        String.class);

// Now this statement is fully generic with no warnings
SortedSet<String> s = new TreeSet<String>(keys);

答案 1 :(得分:29)

就这个问题而言,你应该使用参数化类型的键,例如

Set<TypeOfKeyObject> keys = map.keySet();
SortedSet<TypeOfKeyObject> s = new TreeSet<TypeOfKeyObject>(keys);

其中TypeOfKeyObjectmap对象中Key的对象类型。

你可以强制压制警告(正如已经正确建议的那样),但不建议。

冒着听起来居高临下的风险,我建议你研究仿制药。一个很好的起点是:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html