2016-04-27 8 views
0

私は、という約束を定義しているServiceArgumentというインターフェースを持っています。私enum種類の一般的な列挙型のメンバーまたはメソッドを適用する

public interface ServiceArgument { 
    public int size(); 
} 

いくつかの私のクラスのいくつかはEnumService抽象クラスをたどる

public enum StringCode implements ServiceArgument { 
    FOO, 
    BAR, 
    BACON, 

    public int size() { 
     return values().length; 
    } 
} 

このインタフェースを実装しています。

public abstract class EnumService { 
    abstract void query (Enum<? extends ServiceArgument> e); 
} 

そして、それをラップするためには、いくつかのクラスは、この抽象クラスを拡張する:

public class ServiceTranslation extends EnumService implements Serializable { 
/**some code and ctors and transient stuff etc **/ 

    @Override 
    void query (Enum<? extends ServiceArgument> e) { 
//line that matters : 
     if (e.ordinal() >= e.size()) { 
      throw InvalidStringCodeAsked(); 
    } 
} 

私の問題は、「私はwouldnので、私は、最後の行でe.size()を使用することはできません私の例の列挙でFOO.size()を使用します。

1)するためには、ServiceTranslation.query(MYSTERIOUS.ENUM)で呼び出さ列挙型の具体的な種類を取得する)query方法はEnumService

2の具体的な実装のパラメータとして受け入れ何特化: は、どちらかにする方法がありますConcreteENUM.size()に電話することができます。またはConcreteEnum.values()。lengthと同じです。

3)適切な列挙型以外のものをフィルタリングして、メソッドオーバーライドによって直接InvalidEnumeratedTypeExceptionをスローすることもできますが、複数のオーバーライドに精通していません。

4)私は

編集を考えていなかった何か:@shmoselコメントには、私は、引数として間違って列挙を取得した場合でも、権利である、それは、そのサイズより大きくなることはありません。それをサイズと比較することはできません。

+0

'e.ordinal()> = e.size()はどのように使用できますか?また、 'e.getClass()。getEnumConstants()。length'から取得できるときに、なぜ各定数が列挙型サイズを返す必要があるのか​​分かりません。 – shmosel

+0

誰かが間違った列挙型を引数として与える場合:/そして、ありがとう、それは私が必要とするものの一部です。 –

+0

「間違った列挙型」の意味が不明です。渡された型が、それ自身の列挙型サイズと比較されています。それは決して失敗しません。 – shmosel

答えて

2

この場合はどうですか?

public abstract class EnumService { 
    abstract <T extends Enum<T> & ServiceArgument> void query (T e); 
} 

public class ServiceTranslation extends EnumService implements Serializable { 
    @Override 
    <T extends Enum<T> & ServiceArgument> void query (T e) { 
     if (e.ordinal() >= e.size()) { 
      throw InvalidStringCodeAsked(); 
     } 
    } 
} 
+0

もし正しいとすれば、TはEnum とServiceArgumentsを継承してTパラメータを取ると言います。しかし、なぜEnum ? –

+1

@PierreAntoineGuillaume - それについての議論については、[here](http://stackoverflow.com/q/3061759/823393)を参照してください。 – OldCurmudgeon

関連する問題