【问题标题】:HashMap default types for K and VK 和 V 的 HashMap 默认类型
【发布时间】:2008-11-04 23:13:04
【问题描述】:

我通常会键入我的地图声明,但正在做一些维护,发现一个没有键入。这让我思考(哦,不!)。 Map 声明的默认类型是什么。考虑以下几点:

Map map = new HashMap();
map.put("one", "1st");
map.put("two", new Integer(2));
map.put("three", "3rd");
for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

此错误与 Map.Entry 上的不兼容类型有关。因此,如果我键入声明:

Map<Object, Object> map = new HashMap();

然后一切正常。那么在声明中设置的默认类型是什么?还是我错过了什么?

【问题讨论】:

    标签: java generics collections


    【解决方案1】:

    没有默认类型。

    Java 泛型中的类型仅用于编译时检查。它们在运行时被擦除并且基本上消失了。

    将泛型视为一个静态助手,以 a) 更好地记录您的代码,b) 启用一些有限的编译时检查以确保类型安全。

    【讨论】:

      【解决方案2】:

      类型是java.lang.Object

      for 构造采用 Iterable 类型并调用其 iterator 方法。由于 Set 没有使用泛型进行类型化,因此迭代器返回 Object 类型的对象。这些需要显式转换为类型 Map.Entry

      Map map = new HashMap();
      map.put("one", "1st");
      map.put("two", new Integer(2));
      map.put("three", "3rd");
      for (Object o : map.entrySet()) {
          Map.Entry entry = (Map.Entry) o;
          System.out.println(entry.getKey() + " -> " + entry.getValue());
      }
      

      【讨论】:

        【解决方案3】:

        HashMap 是对象的集合,Think C++ 容器。地图的每个元素都是一个保存数据的“桶”。
        您将不同类型的数据放入存储桶中,hashmap 需要知道这些数据类型并非都是相同的。如果仅将一种类型的数据放置在哈希图中,您会收到警告,但它会编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 2013-07-15
          • 2018-10-07
          • 1970-01-01
          • 2020-12-29
          • 2017-07-03
          相关资源
          最近更新 更多