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

标签 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) { 
        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 ?> to RandomList<Integer> Cannot infer type arguments for 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
}

通配符也不起作用。请注意,? 表示:特定未知 类型。人们的一个普遍误解是通配符的意思是“任何类型”,但它不是这个意思。如果您想要“任何类型”,请使用 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/

相关文章:

java - 使用 FitViewport 时坐标关闭

c++ - 如果需要,如何使用 Boost 库将具有可变数量参数的处理程序传递给类

python - 函数未正确写入 .xls。 Python 2.7.1

java - 实例化泛型类

java - 我怎样才能在java中得到总和?

java - Java 类中允许的最大代码行数?

java - isInstance() 类未找到异常

javascript - 将函数复制回从字符串解析的对象中

C# 泛型、接口(interface)和继承

c# - 使两个并行继承结构跨层交互的方法