注:この質問は、列挙型よりもジェネリックについてです。最初に一致する列挙型からenum定数を取得する方法
私はいくつかの列挙型を持っており、すべて共通のインターフェイスIEffect
を実装しています。
enum ElementalEffect implements IEffect {
FIRE, WATER;
}
enum CombatEffect implements IEffect {
PARALYSIS, SLEEP;
}
例えば
私は武器にエフェクトを追加する必要があります設定ファイルを、解析したいと思います。そのためには、特定の名前をその効果の1つに解決する必要があります。維持するために、それをシンプルに保つために、私はこのような方法を書いて考える(主に擬似コード、これはコンパイルされません実際には疑問の点は、このコンパイルを作成する方法です。):今
IEffect resolveEffectName(String name, Class... clazzes) {
for(Class clazz : clazzes) {
try {
return Enum.valueOf(clazz, name);
} catch(IllegalArgumentException) { /* ignore, try next class */}
}
throw new IllegalArgumentException("No matching effect found for " + name);
}
// resolveEffectName(readNameFromFile, ElementalEffect.class, CombatEffect.class);
私が持っている問題は、私は...列挙型が引数には適用されません型の方法valueOf(Class<T>, String)
を私に言っ
コンパイラせずにそのメソッドを記述する方法を見つけ出すことができないということです
人々は、これが動作しない
private static ICombatEffectType getFirstResolved(String name, Class<? extends Enum<?>>... classes) {
for (Class<? extends Enum<?>> clazz : classes) {
try {
return Enum.valueOf(clazz, name);
} catch (IllegalArgumentException e) {
}
}
return null;
}
それがあるべきと述べました。試してみてください(あなたが私を信じていない場合)。
Enum型のメソッド
valueOf(Class<T>, String)
はあなたの最初の方法を使用して、引数(Class<capture#6-of ? extends Enum<?>>, String)
'Class <? extends Enum >> ... clazzes' –
クラスの '? 'とネストされたEnumのキャプチャは異なるがEnum.valueOfを呼び出すためには同じでなければならないので、これは機能しない – WorldSEnder
Hm 、真実。しかし、タイプセーフな方法でこれを書くのに問題がある場合は、まったく別のアプローチを見つける必要があるかもしれないと考えてください。 –