Примечание: этот вопрос больше о дженериках, чем о перечислениях.Как получить константу перечисления из первого подходящего типа перечисления
У меня есть несколько типов перечислений, все реализующие общий интерфейс IEffect
.
Например
enum ElementalEffect implements IEffect {
FIRE, WATER;
}
enum CombatEffect implements IEffect {
PARALYSIS, SLEEP;
}
Я хотел бы разобрать конфигурационный файл, который должен добавлять эффекты к оружию. Для этого я должен разрешить данное имя для одного из эффектов. Для того, чтобы сохранить его простым в обслуживании, я думал о написании метода, как это (. В основном псевдо-код, это не компилируется На самом деле точка вопрос в том, как сделать эту компиляцию):
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)
в типе Enum не применим для аргументов ...
Люди говорят, что должно быть
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;
}
Это не работает. Не стесняйтесь попробовать (если вы мне не верите).
Метод
valueOf(Class<T>, String)
в типе Enum не применяется для аргументов(Class<capture#6-of ? extends Enum<?>>, String)
'Класс extends Enum >> ... clazzes' –
Это не работает, потому что захваты для '?' в классе и один для вложенного Enum отличаются друг от друга, но должны быть одинаковыми, чтобы иметь возможность вызвать Enum.valueOf – WorldSEnder
Hm , правда. Но учтите, что если у вас возникли проблемы с написанием этого типа безопасным способом, вам просто нужно будет найти совершенно другой подход. –