为什么HashMap实例的类类型与HashMap.class比较相等?

时间:2018-09-12 14:09:04

标签: java generics

HashMap<String, Set<String>> foo = new HashMap<>();
if (foo.getClass().equals(HashMap.class)) {
    System.out.print(true);
}

以上代码显示为true。 为什么这两种类型比较相等? 对我来说, foo.getClass() HashMap.class 包含更多的类型信息。

2 个答案:

答案 0 :(得分:2)

Java使用type erasure实现了泛型。在运行时,没有有关泛型的信息。

  

泛型被引入Java语言,以在编译时提供更严格的类型检查并支持泛型编程。为了实现泛型,Java编译器将类型擦除应用于:

     
      
  • 如果类型参数不受限制,请用其界限或对象替换通用类型中的所有类型参数。因此,产生的字节码仅包含普通的类,接口和方法。
  •   
  • 必要时插入类型强制转换以保持类型安全。
  •   
  • 生成桥接方法以在扩展的泛型类型中保留多态。
  •   
     

类型擦除确保没有为参数化类型创建新的类;因此,泛型不会产生运行时开销。

答案 1 :(得分:-1)

泛型在运行时并不重要。因此,以下内容:

System.out.println(foo.getClass().equals(HashMap.class));

将返回 true