繁体   English   中英

为什么Java Type Erasure没有阻止编译此代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM