私は、という約束を定義している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コメントには、私は、引数として間違って列挙を取得した場合でも、権利である、それは、そのサイズより大きくなることはありません。それをサイズと比較することはできません。
'e.ordinal()> = e.size()はどのように使用できますか?また、 'e.getClass()。getEnumConstants()。length'から取得できるときに、なぜ各定数が列挙型サイズを返す必要があるのか分かりません。 – shmosel
誰かが間違った列挙型を引数として与える場合:/そして、ありがとう、それは私が必要とするものの一部です。 –
「間違った列挙型」の意味が不明です。渡された型が、それ自身の列挙型サイズと比較されています。それは決して失敗しません。 – shmosel