我的枚举
public enum ExamStausEnum {
RESULTAWAITED("Result Awaiting"),
PASSED("Passed"),
FAILED("Failed");
private String value;
ExamStausEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}
Generic Iterator Enum
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(e);
}
}
结果:
RESULTAWAITED
PASSED
FAILED
如何打印构造函数值?
Result Awaiting
Passed
Failed
答案 0 :(得分:6)
添加另一个参数以获得getValue()
调用的抽象是不可避免的:
static <E extends Enum <E>> void foo(Class<E> elemType, Function<? super E, ?> f) {
for(E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(f.apply(e));
}
}
然后,您可以调用不一定具有该方法的任意enum
类型,例如
foo(Thread.State.class, Object::toString);
或具有以下方法的特定enum
:
foo(ExamStausEnum.class, ExamStausEnum::getValue);
更多用例是可能的:
foo(Thread.State.class, Enum::name);
或
foo(ExamStausEnum.class, Enum::ordinal);
当然,您也可以让ExamStausEnum
类型覆盖toString()
方法,从而无需foo
调用getValue()
方法。
答案 1 :(得分:1)
更为前沿的方法是创建一个接口,声明所有枚举实现的getValue()
方法。
interface EnumWithValue{
@JsonValue
String getValue();
}
public enum ExamStausEnum implements EnumWithValue {
RESULTAWAITED("Result Awaiting"),
PASSED("Passed"),
FAILED("Failed");
private String value;
ExamStausEnum(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
然后你可以在foo
中投射你的枚举:
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(((EnumWithValue)e).getValue());
}
}