我有一个方法A
@Deprecated
public void doSomething (EnumSet <TypeA> param){
}
现在,我想编写一个新方法 B,使其具有相同的签名但采用不同类型的 EnumSet。
public void doSomething(EnumSet <TypeB> param){
}
当我这样做时,eclipse给了我一个相同擦除的错误。有没有办法解决这个目的?提前致谢。如果您需要更多说明,请告诉我。
我有一个方法A
@Deprecated
public void doSomething (EnumSet <TypeA> param){
}
现在,我想编写一个新方法 B,使其具有相同的签名但采用不同类型的 EnumSet。
public void doSomething(EnumSet <TypeB> param){
}
当我这样做时,eclipse给了我一个相同擦除的错误。有没有办法解决这个目的?提前致谢。如果您需要更多说明,请告诉我。
由于 Java 编译器有类型擦除,所以运行时类型信息是未知的。
实际发生的是这两种方法都被编译为
public void doSomething(EnumSet<Object> param)
因此您有两个具有相同签名的方法,这显然是不正确的,因为 JDK 无法决定调用哪一个。您可以将它们命名为不同的名称或使用不同的上限。
根据类型擦除行为:
如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或 Object 。因此,生成的字节码只包含普通的类、接口和方法。
当您调用具有EnumSet<SomeType>
身份的方法时,将SomeType
经历擦除并且不知道。您需要接受SomeType
或Class<SomeType>
避免擦除的实例:
private void doSomethingA(EnumSet<TypeA>){ ... }
private void doSomethingA(EnumSet<TypeA>){ ... }
private void <T extends Enum<T>> doSomething(EnumSet<T extends BaseType> s, T tInst){
if(t instanceof TypeA) doSomethingA(s);
if(t instanceof TypeB) doSomethingB(s);
}
为了可读性,我使用T
andt
但它可以写成:
private void <SOMETYPE extends Enum<SOMETYPE>> doSomething(EnumSet<SOMETYPE> s, SOMETYPE instanceOfSomeType){
if(instanceOfThatType instanceof TypeA) doSomethingA(s);
if(instanceOfThatType instanceof TypeB) doSomethingB(s);
}
请注意SOMETYPE
和T
按原样编写。它们在运行时是占位符,但在编写代码时是字面的。