我有一个类定义了以下两种方法:
public Map<String, Map<String, String>> method(final Map<String, Map<String, String>> data)
public boolean method(final Map<String, String> data)
基于 Java 泛型类型擦除,此代码不应编译,因为它们最终都会得到:
method(Map data)
然而,这段代码在Java 6中编译成功,但在Java 8中却无法编译。
有人可以告诉我为什么它可以在 Java 6 下编译吗?
它可以在 Java 6 下编译,但不能在 Java 7 或 Java 8 下编译。
Java 5 和 Java 6 中存在一个错误:Java 7 中已修复 (#6182950) https://bugs.openjdk.java.net/browse/JDK-6182950.
该错误页面指的是JLS,第 8.4.8.3 节 http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.3,其中指出:
如果类型声明 T 具有成员方法 m1 并且存在在 T 或 T 的超类型中声明的方法 m2 且满足以下所有条件,则会出现编译时错误:
这两种方法都没有对方的子签名,因为这两种方法都没有参数类型,Map<String, Map<String, String>>
and Map<String, String>
是另一个的子类型。但是,他们有同样的抹除,Map
.
它本来不应该编译,但 Java 错误已在 Java 7 中修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)