注意:这个问题更多的是关于泛型而不是枚举。
我有几个枚举类型,它们都实现了一个通用接口(interface) 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);
现在我遇到的问题是,如果编译器不告诉我,我无法弄清楚如何编写该方法
The method
valueOf(Class<T>, String)
in the type Enum is not applicable for the arguments ...
人们说应该是
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;
}
这不起作用。请随意尝试(如果您不相信我)。
The method
valueOf(Class<T>, String)
in the type Enum is not applicable for the arguments(Class<capture#6-of ? extends Enum<?>>, String)
最佳答案
如果这是你的风格,你可以流利地写出来:
class FluentGetter {
private final String name;
private IEffect found;
FluentGetter(String name) { this.name = name; }
<T extends Enum<T> & IEffect> FluentGetter search(Class<T> clazz) {
if (found == null) { // If you've already found something, don't overwrite that.
try {
found = Enum.valueOf(clazz, name);
} catch (IllegalArgumentException e) {}
}
return this;
}
IEffect get() {
return found; // + check if it's null, if you want.
}
}
然后:
IEffect effect =
new FluentGetter(name)
.search(ElementalEffect.class)
.search(CombatEffect.class)
.get();
通过对每个类进行单独的方法调用,可以避免类数组上的通用边界问题。
很确定我自己不会使用这个;只是把它作为一个选项扔掉。
关于java - 如何从第一个匹配的枚举类型获取枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40538063/