30

独自の Enum を引数として取る抽象クラスで抽象メソッドを作成しようとしています。しかし、その Enum がジェネリックになることも必要です。

だから私はそれを次のように宣言しました:

public abstract <T extends Enum<T>> void test(Enum<T> command);

実装では、私は enum をその1つとして持っています:

public enum PerspectiveCommands {
    PERSPECTIVE
}

メソッド宣言は次のようになります。

@Override
public <PerspectiveCommands extends Enum<PerspectiveCommands>> void test(Enum<PerspectiveCommands> command) {

}

しかし、もしそうなら:

@Override
public <PerspectiveCommands extends Enum<PerspectiveCommands>> void test(Enum<PerspectiveCommands> command) {
    if(command == PerspectiveCommands.PERSPECTIVE){
        //do something
    }
}

PerspectiveCommands.PERSPECTIVEエラーで にアクセスできません:

cannot find symbol symbol: variable PERSPECTIVE   location: class Enum<PerspectiveCommands> where PerspectiveCommands is a type-variable: PerspectiveCommands extends Enum<PerspectiveCommands> declared in method <PerspectiveCommands>test(Enum<PerspectiveCommands>)

私はこのような回避策を作りました:

public <T extends Enum<T>> byte[] executeCommand(Enum<T> command) throws Exception{
    return executeCommand(command.name());
}

@Override
protected byte[] executeCommand(String e) throws Exception{
    switch(PerspectiveCommands.valueOf(e)){
        case PERSPECTIVE:
            return executeCommand(getPerspectiveCommandArray());
        default:
            return null;
    }
}

しかし、回避策を実行しないことが可能かどうか知りたいですか?

4

3 に答える 3

6

@axtavt がすでに指摘しているように、問題はシャドウイングです。

コードをそのまま機能させたい場合は、型変数の名前を変更してシャドウイングを削除できます。

public <C extends Enum<C>> void test(Enum<C> command)

また、すべての列挙型派生クラスのインスタンスではなく、コマンド列挙型のみを許可するために、型境界にインターフェイスを追加します。

public <C extends Enum<C> & CommandInterface> void test(Enum<C> command)
于 2013-09-11T10:14:32.480 に答える