【问题标题】:TreeMap generic argument warningTreeMap 通用参数警告
【发布时间】:2012-10-25 09:29:54
【问题描述】:
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")

【问题讨论】:

  • 为什么不呢? TreeMap(m); ?

标签: java generics compiler-warnings unchecked


【解决方案1】:

在实例化 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/

【讨论】:

  • 你在使用 java.util.TreeMap 吗?它应该接受泛型类型。见:docs.oracle.com/javase/7/docs/api
  • @JohnJohnGa 每个人都没有问题。很高兴我能提供帮助,这是否解决了您的问题?
【解决方案2】:

如果你使用 Java 7,你可以使用diamond syntax

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

【讨论】:

    【解决方案3】:

    正确的做法是:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多