通用枚举迭代器java
我的枚举通用枚举迭代器java,java,generics,enums,java-8,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 ge
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;
}
}
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(e);
}
}
通用迭代器枚举
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;
}
}
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(e);
}
}
如何打印构造函数值
Result Awaiting
Passed
Failed
不可避免地要添加另一个参数来抽象
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(ExamStausEnum.class, ExamStausEnum::getValue);
甚至更多的用例是可能的:
foo(Thread.State.class, Enum::name);
或
当然,您也可以让您的
ExamStausEnum
类型重写toString()
方法,从而消除了foo
调用getValue()
方法的需要。更前面的方法是创建一个接口,声明所有枚举实现的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());
}
}
静态void foo(类elemType){
for(E:java.util.EnumSet.allOf(elemType)){
System.out.println(((EnumWithValue)e.getValue());
}
}
您的意思是System.out.println(e.getValue())
?@khelwood,但这对所有枚举都是通用的,而getValue是针对这个名为examstausenumn的枚举的。您可以在您的枚举上覆盖toString()
?您不能通用地这样做。如果您有一对带有值字段的枚举,则可以使用反射来获取该字段。@khelwood yes!想要得到相同的结果我宁愿将声明更改为void foo(Class elemType),而不是插入一个可能在运行时失败的类型转换。我认为在相同的情况下,您的建议在运行时也会失败…当您使用声明时,编译器将已拒绝未实现EnumWithValue
的枚举的Class
对象。使用您的代码,您甚至不会在传递错误类型时收到警告。
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(((EnumWithValue)e).getValue());
}
}