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

use*_*338 56 java

这是我写的代码?

Set keys = map.keySet();
SortedSet s = new TreeSet(keys);
Run Code Online (Sandbox Code Playgroud)

我得到的警告是:

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

如何摆脱编译器警告?

Jon*_*eet 62

理想情况下,完全开始使用泛型.你还没有表明它是什么类型map,但理想情况下你应该能够写出类似的东西:

Set<String> keys = map.keySet();
SortedSet<String> s = new TreeSet<String>(keys);
Run Code Online (Sandbox Code Playgroud)

那将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);
Run Code Online (Sandbox Code Playgroud)


Nis*_*ant 29

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

Set<TypeOfKeyObject> keys = map.keySet();
SortedSet<TypeOfKeyObject> s = new TreeSet<TypeOfKeyObject>(keys);
Run Code Online (Sandbox Code Playgroud)

TypeOfKeyObject对象中Key的对象类型在哪里map.

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

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

  • "使用参数化类型的键"是正确的答案,并且已足够.告诉OP"你需要学习泛型"是居高临下的.如果我们研究过,我们就不需要SO了,现在我们呢?尽管如此,我仍然赞成.:-P (12认同)
  • 你既不给他钓鱼也不教他钓鱼; 你告诉他从图书馆看一本关于钓鱼的书. (12认同)
  • 我在第二段给了他鱼.关于钓鱼的书是告诉他如何在我们的交流媒介下捕鱼的方法.:) 别紧张. (5认同)