HashMap<String, Set<String>> foo = new HashMap<>();
if (foo.getClass().equals(HashMap.class)) {
System.out.print(true);
}
以上代码显示为true。 为什么这两种类型比较相等? 对我来说, foo.getClass()比 HashMap.class 包含更多的类型信息。
答案 0 :(得分:2)
Java使用type erasure实现了泛型。在运行时,没有有关泛型的信息。
泛型被引入Java语言,以在编译时提供更严格的类型检查并支持泛型编程。为了实现泛型,Java编译器将类型擦除应用于:
- 如果类型参数不受限制,请用其界限或对象替换通用类型中的所有类型参数。因此,产生的字节码仅包含普通的类,接口和方法。
- 必要时插入类型强制转换以保持类型安全。
- 生成桥接方法以在扩展的泛型类型中保留多态。
类型擦除确保没有为参数化类型创建新的类;因此,泛型不会产生运行时开销。
答案 1 :(得分:-1)
泛型在运行时并不重要。因此,以下内容:
System.out.println(foo.getClass().equals(HashMap.class));
将返回 true 。