Java中的类型擦除意外行为

Java中的类型擦除意外行为,java,generics,Java,Generics,根据和上的Java文档,我知道在下面的代码示例中,doStuff()的两个版本将具有相同的擦除,因此不会编译。我的目标是重载doStuff(),以便接收ClassOne和ClassTwo的集合 import java.util.List; class Example { class ClassOne { } class ClassTwo { } public void doStuff(List<ClassOne> collection) { } p

根据和上的Java文档,我知道在下面的代码示例中,
doStuff()
的两个版本将具有相同的擦除,因此不会编译。我的目标是重载
doStuff()
,以便接收
ClassOne
ClassTwo
的集合

import java.util.List;

class Example {
  class ClassOne {
  }

  class ClassTwo {
  }

  public void doStuff(List<ClassOne> collection) {
  }

  public void doStuff(List<ClassTwo> collection) {
  }
}
import java.util.List;
课例{
一班{
}
二班{
}
公共作废文件(列表集合){
}
公共作废文件(列表集合){
}
}
类型擦除机制包括以下步骤:

·将泛型类型中的所有类型参数替换为其边界或对象(如果类型参数是无界的)。因此,生成的字节码只包含普通类、接口和方法

因此,我应该能够应用一个绑定,然后进行编译,因为现在doStuff的类型擦除版本使用两个不同的签名(声明的上限)重载。例如:

class Example {
  class ClassOne {
  }

  class ClassTwo {
  }

  public <U extends ClassOne> void doStuff(List<U> collection) {
  }

  public <U extends ClassTwo> void doStuff(List<U> collection) {
  }
}
类示例{
一班{
}
二班{
}
公共作废文件(列表集合){
}
公共作废文件(列表集合){
}
}
第二个示例实际上没有编译,并给出以下错误:

错误:(15,36)java:name冲突:doStuff(java.util.List)和doStuff(java.util.List)具有相同的擦除


有人能给我解释一下吗?

问题是,在这两种方法中,
List
将简化为
List
。(擦除后,不能保留
列表
列表
。)

您引用的段落表示可以有以下声明:

class Example {
    class ClassOne {
    }

    class ClassTwo {
    }

    public <U extends ClassOne> void doStuff(U foo) {
    }

    public <U extends ClassTwo> void doStuff(U foo) {
    }
}
类示例{
一班{
}
二班{
}
公共厕所(U-foo){
}
公共厕所(U-foo){
}
}

这里,泛型参数将分别替换为
ClassOne
ClassTwo
,这两个参数工作得很好。

好吧,您指定了一个无界参数
U
,得到了两个方法,它们都解析为
doStuff(List)
,正如文档所述。如果使用List的方法不起作用,为什么您希望添加“extends”会改变smth?因为当您编写
extends
super
时,类型参数会有界,我认为这可能代表我的类型擦除问题的漏洞(根据链接文档)。简单而简洁的解释+1一个人能否写下doStuff,以便以某种方式收到一份清单?或者类型擦除机制禁止重载?不,不幸的是,当参数仅因类型参数不同而不同时,重载不起作用。