1

私は方法Aを持っています

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

}

ここで、同じ署名を持つが異なる型の EnumSet を取る新しいメソッド B を書きたいと思います。

public void doSomething(EnumSet <TypeB> param){

}

私がそれをすると、日食は私に同じ消去のエラーを与えます。この目的を解決する方法はありますか? 前もって感謝します。さらに明確にする必要がある場合はお知らせください。

4

2 に答える 2

2

Java コンパイラには型消去機能があるため、実行時の型情報は不明です。

実際に起こることは、両方のメソッドがコンパイルされることです

public void doSomething(EnumSet<Object> param)

したがって、同じ署名を持つ 2 つのメソッドがあります。JDK はどちらを呼び出すかを決定できなかったため、これは明らかに正しくありません。それらに別の名前を付けるか、別の上限を使用することができます。

タイプ消去動作によると:

型パラメーターが unbounded の場合は、ジェネリック型のすべての型パラメーターを境界またはオブジェクトに置き換えます。したがって、生成されたバイトコードには、通常のクラス、インターフェース、およびメソッドのみが含まれます。

于 2013-10-22T20:51:06.800 に答える
1

EnumSet<SomeType>ID を指定してメソッドを呼び出すと、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読みやすくするためにandを使用します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);
}

SOMETYPETはそのまま書かれていることに注意してください。これらは実行時のプレースホルダーですが、コードの作成時にはリテラルです。

于 2013-10-22T20:49:03.097 に答える