java - 如何从第一个匹配的枚举类型获取枚举常量

标签 java generics enums

注意:这个问题更多的是关于泛型而不是枚举。

我有几个枚举类型,它们都实现了一个通用接口(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/

相关文章:

java - 从 Java 中的 Enum 类型参数获取信息

ArrayLists 的 Java 并发性(线程)。经典for和foreach的区别

java - hashmap和多个txt文件java

java - 如何用更具体的类型替换参数化类型

swift - 无法将类型 T 的值分配给类型 T

python - 在 PySide2 中为 QML 注册枚举

java - Java 编译时生成枚举

java - 如何从对象中包含的对象列表中每个元素的字段中检索字符串集?

java - "Failed to load Main-Class manifest attribute from client.jar"在可能的恶意软件 .jar 文件中?

Java Generics - 关于 Greater Than Method with Objects 的快速问题