java - 如何在给定集合名称(ArrayList、LinkedList 等)和集合中的项目的情况下创建任何集合?

标签 java generics reflection

我正在尝试创建一个接受集合类型和集合内项目类型的方法。

ArrayList<Integer> ints = getCollection(ArrayList.class, Integer.class);

如何编写 getCollection 以便在给定任何 Collection 子类和任何 Number 子类的情况下,该方法应该创建一个集合并用 Number 或数字的子类型?

最佳答案

如果可以的话,最好为集合传入一个Supplier,传入一个Function将Number转为子类型,如:

    private static final SecureRandom RND = new SecureRandom();
    private static final int COUNT_MAX = 100;

    public static void main(String[] args) {
        ArrayList<Integer> ints = getCollection(ArrayList::new, Number::intValue);
        System.out.println(ints);
        Set<Double> doubles = getCollection(HashSet::new, Number::doubleValue);
        System.out.println(doubles);
    }

    private static <T extends Collection<U>, U extends Number> T getCollection(
        Supplier<T> supplier, Function<Number, U> fn) {
        T collection = supplier.get();
        int count = RND.nextInt(COUNT_MAX);
        for (int i = 0; i < count; i++)
            collection.add(fn.apply(RND.nextInt()));
        return collection;
    }

这样,您就不需要任何转换。

更新使用流:

    private static <T extends Collection<U>, U extends Number> T getCollection(
        Supplier<T> supplier, Function<Number, U> fn) {
        int count = RND.nextInt(COUNT_MAX);
        return RND.ints().limit(count).boxed().map(fn)
            .collect(Collectors.toCollection(supplier));
    }

关于java - 如何在给定集合名称(ArrayList、LinkedList 等)和集合中的项目的情况下创建任何集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58613584/

相关文章:

java - 如何获取不连续的子数组。通过合并多个 .copyOf 范围

java - 使用 Maven 模块化项目

java - 通配符类作为构造函数中的变量

java - Threads 和 Hibernate session 的随机错误

javascript - 获取传递给函数的 Javascript 'type'

java - 是否有机会在我的项目中使用 Class <?, ?> ?

java - 如何使用通配符将泛型传递给函数而不进行强制转换?

java - 在这种情况下如何在 java 泛型中使用多个边界

Java:如何动态覆盖类的方法(类最终不在类路径中)?

c# - 反射(reflection):FindMembers 返回空