在枚举中,我想将一个函数关联到每个元素,例如:
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;
}
函数的返回类型(问号)应该是相应元素的类。所以对于 INTEGER
, Function
的返回类型应该是整数并且对于 CHARACTER
应该是Character
.我如何实现这一目标?如果我将它与问号保持原样并尝试在 RandomList<Integer> randomList = new RandomList<>(eleType.getCreator(), 10);
中使用它在哪里
public class RandomList<T> {
private List<T> list;
public List<T> getList() {
return list;
}
public RandomList (Function<Random, T> creator, int n) {
list = new ArrayList<T>();
Random rand = new Random();
rand.setSeed(System.currentTimeMillis());
for (int i = 0; i < n; i++) {
list.add(creator.apply(rand));
}
}
}
我收到一条错误消息:
Type mismatch: cannot convert from
RandomList<capture#2-of ?>
toRandomList<Integer>
Cannot infer type arguments forRandomList<>
最佳答案
理想情况下,您想要做的是为枚举提供一个类型参数。概念上是这样的;但这不起作用,因为枚举不能有类型参数:
// 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
}
通配符也不起作用。请注意,?
表示:特定 但未知 类型。人们的一个普遍误解是通配符的意思是“任何类型”,但它不是这个意思。如果您想要“任何类型”,请使用 Object
而不是 ?
- 当然这意味着您会丢失类型信息和类型安全性。
最类型安全的方法是使用带有类型参数和公共(public)静态常量的类而不是枚举。
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
}
关于枚举中的Java变量返回函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109948/