我有方法A
@Deprecated
public void doSomething (EnumSet <TypeA> param){
}
现在,我想编写一个新方法B,使其具有相同的签名,但采用不同类型的EnumSet。
public void doSomething(EnumSet <TypeB> param){
}
当我这样做时,eclipse给了我同样擦除的错误。有没有办法解决这个目的? 提前致谢。如果您需要更多说明,请与我们联系。
答案 0 :(得分:2)
由于Java编译器具有类型擦除,因此运行时类型信息是未知的。
实际发生的是两种方法都编译为
public void doSomething(EnumSet<Object> param)
因此你有两个具有相同签名的方法,这显然是不正确的,因为JDK无法决定调用哪一个。你可以用不同的方式命名它们或使用不同的上限。
根据type erasure行为:
如果类型参数是无界的,则将通用类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。
答案 1 :(得分:1)
当您使用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
按原样编写。它们在运行时是占位符,但在编写代码时是文字。