1
Map<Date, Integer> m = new HashMap<Date, Integer>(); // line 1
Map<Date, Integer> sMap = new TreeMap(m);            // line 2

第 2 行给出了这个错误:

类型安全:TreeMap 类型的表达式需要未经检查的转换才能符合 Map

我找到的解决方案是:如何修复“List 类型的表达式需要未经检查的转换...”?

但是,@SuppressWarnings("unchecked")我的代码是否会失败或者是否存在安全的情况。更一般地说,我们什么时候可以安全地添加@SuppressWarnings("unchecked")?

4

4 回答 4

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/

于 2012-10-25T09:32:39.487 回答
2

如果您使用 Java 7,则可以使用菱形语法

Map<Date, Integer> m = new HashMap<>();
Map<Date, Integer> sMap = new TreeMap<>(m);
于 2012-10-25T09:35:01.280 回答
1

正确的方法是:

1. Map<Date, Integer> m = new HashMap<Date, Integer>();
2. Map<Date, Integer> sMap = new TreeMap<Date, Integer>(m);

如果您确定泛型类型,您还可以取消“未检查”警告。在这种情况下,你是。

于 2012-10-25T09:32:49.383 回答
0

如前所述,向 TreeMap 添加泛型参数可以解决问题,因为编译器现在可以保证不会发生无效转换。如果您省略泛型参数,编译器将无法为您提供此保证,因此会警告您。那么只有正确类型的对象才存储在 TreeMap 中是您的责任。

如果您确定只有正确的对象被放入 TreeMap,您可以放心地忽略该警告。如果它失败并且您在运行时遇到类转换异常,那是您自己的错(:

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

于 2012-10-25T09:34:50.373 回答