Как мне создать любую Коллекцию с заданным именем коллекции (ArrayList, LinkedList и т. Д.) И элементами в коллекции? - PullRequest
2 голосов
/ 29 октября 2019

Я пытаюсь создать метод, который принимает тип коллекции и тип элементов внутри коллекции.

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

Как написать getCollection , чтобы при наличии любого подкласса Collection и любого подкласса Number метод создавал коллекцию и заполнял ее случайными элементами Number или подтипом Number?

1 Ответ

1 голос
/ 29 октября 2019

Если вы можете, было бы лучше передать Поставщика для сбора и функцию для преобразования из числа в подтип, например:

    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));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...