我有一个类定义了以下两个方法:
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下编译它?
答案 0 :(得分:7)
它在Java 6下编译,但在Java 7或Java 8中编译。
Java 5和Java 6中存在fixed in Java 7 (#6182950)的错误。
该错误页面引用JLS, Section 8.4.8.3,其中指出:
如果类型声明T具有成员方法m1并且存在以T声明的方法m2或T的超类型使得以下所有条件都为真,那么这是编译时错误:
m1和m2具有相同的名称。
- 访问
m2可从T。
m1的签名不是m2签名的子签名(§8.4.2)。
m1的签名或某些方法m1覆盖(直接或间接)具有与m2的签名相同的擦除或某种方法m2覆盖(直接或间接)。
两种方法都没有另一种方法的子签名,因为参数类型Map<String, Map<String, String>>
和Map<String, String>
都不是另一种的子类型。但是,他们有相同的删除,Map
。
它永远不应该编译,但Java 7修复了Java错误。