使用EnumSet(不同类型)作为参数的相同方法名称

时间:2013-10-22 20:47:40

标签: java android eclipse deprecated enumset

我有方法A

@Deprecated
public void doSomething (EnumSet <TypeA> param){

}

现在,我想编写一个新方法B,使其具有相同的签名,但采用不同类型的EnumSet。

public void doSomething(EnumSet <TypeB> param){

}

当我这样做时,eclipse给了我同样擦除的错误。有没有办法解决这个目的? 提前致谢。如果您需要更多说明,请与我们联系。

2 个答案:

答案 0 :(得分:2)

由于Java编译器具有类型擦除,因此运行时类型信息是未知的。

实际发生的是两种方法都编译为

public void doSomething(EnumSet<Object> param)

因此你有两个具有相同签名的方法,这显然是不正确的,因为JDK无法决定调用哪一个。你可以用不同的方式命名它们或使用不同的上限。

根据type erasure行为:

  

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

答案 1 :(得分:1)

当您使用EnumSet<SomeType>调用该方法时,SomeType的身份会被删除并且不知道。您需要接受SomeTypeClass<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);
}

为了便于阅读,我使用Tt,但可以写成:

private void <SOMETYPE extends Enum<SOMETYPE>> doSomething(EnumSet<SOMETYPE> s, SOMETYPE instanceOfSomeType){
    if(instanceOfThatType instanceof TypeA) doSomethingA(s);
    if(instanceOfThatType instanceof TypeB) doSomethingB(s);
}

请注意,SOMETYPET按原样编写。它们在运行时是占位符,但在编写代码时是文字。