这是我写的代码?
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
如何摆脱编译器警告?
答案 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);
其中TypeOfKeyObject
是map
对象中Key的对象类型。
你可以强制压制警告(正如已经正确建议的那样),但不建议。
冒着听起来居高临下的风险,我建议你研究仿制药。一个很好的起点是:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html