我的枚举类型 -
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())
让我 -
Foo -
[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());
}
答案 0 :(得分:1)
我怀疑你的Arrays.asList(c.getEnumConstants())
实际上是在正常工作。打印阵列时所看到的是toString()
成为Bar
的{{1}}结果列表。
尝试类似:
[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() + "\")");
}
}
答案 1 :(得分: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);