通用枚举迭代器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());
    }
}