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

时间:2016-12-12 21:31:28

标签: java function generics enums

在Enum中,我想将一个函数与每个元素相关联,如:

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;


}

函数的返回类型(问号)应该是相应元素的类。因此,对于INTEGERFunction的返回类型应为整数,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));
        }
    }
}

我收到一条错误消息:

  

类型不匹配:无法从RandomList<capture#2-of ?>转换为        RandomList<Integer>   无法推断RandomList<>

的类型参数

1 个答案:

答案 0 :(得分:3)

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

data: { product_id:product_id, quantity:quantity, "option[product_option]":product_option_id}

通配符也不起作用。请注意,// 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 } 表示:特定,但未知类型。人们普遍存在的误解是,通配符意味着任何类型的#34;但这并不意味着什么。如果你想要&#34;任何类型&#34;,请使用?而不是Object - 但是当然这意味着你丢失了类型信息和类型安全。

最类型安全的方法是使用带有类型参数和公共静态常量的类而不是枚举。

?