枚举中函数的Java变量返回类型

枚举中函数的Java变量返回类型,java,function,generics,enums,Java,Function,Generics,Enums,在枚举中,我希望将一个函数与每个元素相关联,如: public enum EleType { INTEGER(Integer.class,rand -> rand.nextInt()), CHARACTER(Character.class, rand -> (char) (rand.nextInt(26) + 'a')); private EleType(Class cl, Function<Random, ?> cr) {

在枚举中,我希望将一个函数与每个元素相关联,如:

public enum EleType {
    INTEGER(Integer.class,rand -> rand.nextInt()), 
    CHARACTER(Character.class, rand -> (char) (rand.nextInt(26) + 'a'));

    private EleType(Class cl, Function<Random, ?> cr) { 
        this.classType = cl; 
        this.creator = cr;
    }
    public Class getClassType() { return classType; }
    public Function<Random, ?> getCreator() { return creator; }


    private final Class<?> classType;

    private final Function<Random, ?> creator;


}
我收到一条错误消息:

类型不匹配:无法从
随机列表
转换为
RandomList
无法推断
RandomList


理想情况下,您要做的是为枚举提供一个类型参数。概念上是这样的;但这不起作用,因为枚举不能有类型参数:

// Not valid Java!
public enum EleType<T> {
    INTEGER(Integer.class, rand -> rand.nextInt()),
    CHARACTER(Character.class, rand -> (char) (rand.nextInt(26) + 'a'));

    private final Class<T> classType;
    private final Function<Random, T> creator;

    // Constructor and getters
}

谢谢,我想你是想写:
publicstaticfinaleletypeinteger=neweletype(INTEGER.class,rand->rand.nextInt())
和类似的字符,对吗?我如何定义类似于
enum
中的
values()
方法?您必须自己实现类似
values()的方法;它可以只返回一个固定的值列表,也可以通过反射找到类的所有静态最终字段。修复了您在第一条注释中提到的问题。但是
values()
的返回类型是什么?
// Not valid Java!
public enum EleType<T> {
    INTEGER(Integer.class, rand -> rand.nextInt()),
    CHARACTER(Character.class, rand -> (char) (rand.nextInt(26) + 'a'));

    private final Class<T> classType;
    private final Function<Random, T> creator;

    // Constructor and getters
}
public final class EleType<T> {
    public static final EleType<Integer> INTEGER = new EleType<>(Integer.class,
            rand -> rand.nextInt());
    public static final EleType<Character> CHARACTER = new EleType<>(Character.class,
            rand -> (char) (rand.nextInt(26) + 'a'));

    private final Class<T> classType;
    private final Function<Random, T> creator;

    private EleType(Class<T> classType, Function<Random, T> creator) {
        this.classType = classType;
        this.creator = creator;
    }

    // Getters
}