【问题标题】:Eclipse Warning with Java HashMap带有 Java HashMap 的 Eclipse 警告
【发布时间】:2010-07-28 14:02:58
【问题描述】:

当我使用以下代码时,Eclipse 说“HashMap 是原始类型”

HashMap = new HashMap();

知道可能出了什么问题吗?

【问题讨论】:

  • 尝试类似:HashMap h = new HashMap();正如其他人提到的,您没有指定键和值的类型。提供此信息以进行类型检查更安全。
  • @James 或者更好final Map<String,String> h = new HashMap<String,String>();
  • @Tom Hawtin - 没错,使用 Map 会更好,但我只是在效仿他的例子。 :)

标签: java eclipse generics hashmap


【解决方案1】:

当您使用 Java 5 或更高版本使用非Generic HashMap 时,Eclipse 会向您发出警告。

另请参阅:Sun 的 Java 教程中的 Generics Lesson

编辑:其实,在这里,我也举个例子:

假设我想将某人的名字映射到他们的Person 对象:

Map<String, Person> map = new HashMap<String, Person>();
// The map.get method now returns a Person
// The map.put method now requires a String and a Person

这些是在编译时检查的;由于 Java 实现泛型的方式,类型信息在运行时会丢失。

【讨论】:

  • map.get() 仍然需要一个对象。这可能看起来令人惊讶(如果您不相信我,请查看 javadoc),但 Josh Bloch 曾经对此发表过评论,说如果他们将签名更改为 get(K key) 他们可能会导致代码错误,事实上,正确。
  • @waxwing:很有趣。当我查看 Map/HashMap 页面时,我应该注意到这一点。我会解决的。哦,我也忘了提到 get 现在返回一个 Person 对象。哎呀。
  • @R. Bemrose:从技术上讲,get 仍然返回 Object,但泛型告诉编译器向 Person 添加强制转换。
  • @Brian:不过,这是在内部完成的。它在Map/HashMap 文档中记录为返回类型V,不像它的参数采用Object
【解决方案2】:

没有什么,但你错过了美妙的泛型世界。根据您要对地图中使用的类型施加的约束,您应该添加类型参数。例如:

Map<String, Integer> map = new HashMap<String, Integer>();

【讨论】:

    【解决方案3】:

    那是缺少泛型,即 .如果你不知道thise然后将eclipse编译器设置为java 1.4

    【讨论】:

      【解决方案4】:

      试试

      HashMap<String,Integer> map = new HashMap<String,Integer>();
      

      改为(显然替换了键类型(String)和值类型(Integer))。

      【讨论】:

        【解决方案5】:

        这通常意味着您将通用代码与非通用代码混合在一起。

        但是由于您的示例甚至无法编译,因此很难说....

        【讨论】:

          【解决方案6】:

          它缺少泛型类型。您应该为您的地图指定键值通用对。例如,下面的声明用 String 类型键和 Integer 类型值实例化了 HashMap

          Map<String, Integer> map = new HashMap<String, Integer>();
          

          【讨论】:

            【解决方案7】:

            所有这些都是有效的答案,您也可以使用@SurpressWarnings 注释来获得相同的结果,而无需求助于实际的泛型。 ;)

            【讨论】:

              【解决方案8】:

              hashmap 是原始类型,因此应该参数化,即 无论我们通过 haspmap 函数获得什么数据,都必须声明它们的类型才能获取其函数

              例如

              HashMap<String, Integer> map = new HashMap<String, Integer>();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-06-24
                • 2016-12-19
                • 2011-07-12
                • 1970-01-01
                • 2013-04-28
                • 2021-12-27
                • 1970-01-01
                • 2015-10-18
                相关资源
                最近更新 更多