2

我的枚举类型-

public enum Foo {A, B, C}

public enum Bar {A("aaa"), B("bbb"), C("ccc")}

我在运行时所拥有的只是枚举类名,即“Foo”

我这样做 -

Class<?> c = Class.forName(getClassName()) // local function 

使用Arrays.asList(c.getEnumConstants())让我 -

富 -

[A, B, C]

酒吧 -

[aaa, bbb, ccc]

我也想[A, B, C]在评估时Bar

.values()是我想要的,但我如何在没有任何显式转换的情况下动态获得它?

非常感谢您的回复。

找到了解决办法——

List<? extends Enum<?>> enums = (List<? extends Enum<?>>) Arrays.asList(c.getEnumConstants());
for (Enum<?> e: enums) {
    System.err.println("e.name: " + e.name());
}
4

2 回答 2

3

我怀疑你Arrays.asList(c.getEnumConstants())实际上工作正常。当您打印出数组时,您看到的是一个列表,其中的toString()结果为.Bar[aaa, bbb, ccc]

尝试类似:

for (Bar b : Bar.class.getEnumConstants()) {
  System.out.println(b.name() + "(\"" + b.toString() + "\")");
}

你应该明白我的意思。

如果你有一个enum定义自己的,toString()你可以尝试包装它:

static class EnumNamer<T extends Enum<T>> {
  final T he;

  public EnumNamer(T he) {
    this.he = he;
  }

  @Override
  public String toString() {
    return he.name();
  }
}

public void test() {
  System.out.println("Hello");
  for (Bar b : Bar.class.getEnumConstants()) {
    System.out.println(b.name() + "(\"" + b.toString() + "\")");
    EnumNamer<Bar> en = new EnumNamer<>(b);
    System.out.println(en + "(\"" + en.toString() + "\")");
  }
}

现在你已经澄清了几点——这对我有用:

// This cast should be OK so long as we KNOW its an enum.
Class<Enum> c = (Class<Enum>)Class.forName(Bar.class.getName());
for (Enum e : c.getEnumConstants()) {
  EnumNamer en = new EnumNamer(e);
  System.out.println(en + "(\"" + en.toString() + "\")");
}
于 2013-08-15T11:21:41.873 回答
0

对于Bar您可以在检索常量时使用以下代码:

List<Bar> list = Arrays.asList(c.getEnumConstants());
List<String> list1 = new ArrayList<String>();
for (Bar b : list)
{
   list1.add(b.name());
}
System.out.println(list1);
于 2013-08-15T11:58:06.453 回答