我有一个类定义了以下两个方法:
public Map<String, Map<String, String>> method(final Map<String, Map<String, String>> data)
public boolean method(final Map<String, String> data)
Run Code Online (Sandbox Code Playgroud)
基于Java类型擦除泛型,这段代码不应该编译,因为它们最终都是:
method(Map data)
Run Code Online (Sandbox Code Playgroud)
但是,此代码已在Java 6中成功编译,但未在Java 8中编译.
有人可以让我知道为什么它可以在Java 6下编译?
它在Java 6下编译,但在Java 7或Java 8中编译.
Java 5和Java 6中存在一个在Java 7中修复的错误(#6182950).
该bug页面引用了JLS,第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错误.