[英]Why didn't Java Type Erasure prevents this code from compiling
我有一个类定义了以下两个方法:
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) 。
该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错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.