1

我有一个方法A

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

}

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

public void doSomething(EnumSet <TypeB> param){

}

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

4

2 回答 2

2

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

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

public void doSomething(EnumSet<Object> param)

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

根据类型擦除行为:

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

于 2013-10-22T20:51:06.800 回答
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);
}

为了可读性,我使用Tandt但它可以写成:

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按原样编写。它们在运行时是占位符,但在编写代码时是字面的。

于 2013-10-22T20:49:03.097 回答