Sha*_*oor 0 java generics enums java-8
我的枚举
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;
}
}
Run Code Online (Sandbox Code Playgroud)
通用迭代器枚举
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(e);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
RESULTAWAITED
PASSED
FAILED
Run Code Online (Sandbox Code Playgroud)
如何打印构造函数值?
Result Awaiting
Passed
Failed
Run Code Online (Sandbox Code Playgroud)
添加另一个参数以获得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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以调用enum不一定具有该方法的任意类型,例如
foo(Thread.State.class, Object::toString);
Run Code Online (Sandbox Code Playgroud)
或者您的具体enum方法:
foo(ExamStausEnum.class, ExamStausEnum::getValue);
Run Code Online (Sandbox Code Playgroud)
更多用例是可能的:
foo(Thread.State.class, Enum::name);
Run Code Online (Sandbox Code Playgroud)
要么
foo(ExamStausEnum.class, Enum::ordinal);
Run Code Online (Sandbox Code Playgroud)
当然,您也可以让您的ExamStausEnum类型覆盖该toString()方法,从而无需foo调用该getValue()方法.