Java中的类型擦除意外行为
根据和上的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
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,以便以某种方式收到一份清单?或者类型擦除机制禁止重载?不,不幸的是,当参数仅因类型参数不同而不同时,重载不起作用。