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

时间:2015-02-10 21:30:06

标签: java generics

我有一个类定义了以下两个方法:

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下编译它?

1 个答案:

答案 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错误。