Map<Date, Integer> m = new HashMap<Date, Integer>(); // line 1
Map<Date, Integer> sMap = new TreeMap(m); // line 2
第2行出现此错误:
类型安全:TreeMap类型的表达式需要未经检查的转换 符合地图
我找到的解决方案是:How do I fix "The expression of type List needs unchecked conversion...'?
但是,简单地@SuppressWarnings("unchecked")
是否安全,或者是否存在我的代码失败的情况。更一般地说,我们什么时候可以安全地添加@SuppressWarnings("unchecked")
?
答案 0 :(得分:4)
在实例化时尝试指定TreeMap的泛型类型。
Map<Date, Integer> m = new HashMap<Date, Integer>(); // line 1
Map<Date, Integer> sMap = new TreeMap<Date,Integer>(m);
这个答案假设您正在使用java.util.TreeMap。请参阅:http://docs.oracle.com/javase/7/docs/api/
答案 1 :(得分:2)
如果您使用Java 7,则可以使用diamond syntax:
Map<Date, Integer> m = new HashMap<>();
Map<Date, Integer> sMap = new TreeMap<>(m);
答案 2 :(得分:1)
正确的方法是:
1. Map<Date, Integer> m = new HashMap<Date, Integer>();
2. Map<Date, Integer> sMap = new TreeMap<Date, Integer>(m);
如果您确定通用类型,也可以禁止“取消选中”警告。在这种情况下,你是。
答案 3 :(得分:0)
如前所述,向TreeMap添加泛型参数可以解决问题,因为编译器现在可以保证不会发生无效的强制转换。如果省略通用参数,编译器无法为您提供此保证,因此会向您发出警告。那么您的责任是只有正确类型的对象存储在TreeMap中。
如果您确定只将正确的对象放入TreeMap,您可以放心地忽略该警告。如果它失败并且您在运行时遇到类转换异常,那么这是您自己的错((
一般来说,如果你发出警告,你实际上忽略了编译器的提示,即代码中可能存在问题。但编译器很愚蠢,有些情况下你可以安全地说不会出现任何问题(例如你有其他检查或设计不允许错误发生)。如果是这种情况,您可以取消警告。