>我有一个方法 A
@Deprecated
public void doSomething (EnumSet <TypeA> param){
}
现在,我想编写一个新方法 B,使其具有相同的签名,但采用不同类型的 EnumSet。
public void doSomething(EnumSet <TypeB> param){
}
当我这样做时,日食给了我一个相同的擦除错误。有没有办法解决这个问题?提前谢谢。如果您需要更多说明,请告诉我。
由于 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
和t
但它可以写成:
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
按原样编写。它们在运行时是占位符,但在编写代码时是文字。