TreeMap泛型参数警告

时间:2012-10-25 09:29:55

标签: java generics compiler-warnings unchecked

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")

4 个答案:

答案 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,您可以放心地忽略该警告。如果它失败并且您在运行时遇到类转换异常,那么这是您自己的错((

一般来说,如果你发出警告,你实际上忽略了编译器的提示,即代码中可能存在问题。但编译器很愚蠢,有些情况下你可以安全地说不会出现任何问题(例如你有其他检查或设计不允许错误发生)。如果是这种情况,您可以取消警告。