枚举中函数的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
}