Метод рефакторинга для использования дженериков - PullRequest
0 голосов
/ 30 сентября 2018

Сначала я пишу:

private ArrayList<Integer> getDataList() {
    ArrayList<Integer> dataList = new ArrayList<>(LEN);
    for (int i = 0; i < LEN; i++)
        dataList.add(i);
    Collections.shuffle(dataList);
    return dataList;
}

Позже я решаю использовать универсальный:

private <E> ArrayList<E> getDataList() {
    ArrayList<E> dataList = new ArrayList<>(LEN);
    for (int i = 0; i < LEN; i++)
        dataList.add(/* a procedure that generates E instance from index i*/);
    Collections.shuffle(dataList);
    return dataList;
}

Статические методы в интерфейсе не могут переопределяться, поэтому не могут вызывать статический методна E, чтобы сгенерировать экземпляр.

Как реорганизовать это, чтобы использовать дженерики?Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2018

Вам нужно предоставить что-то, что делает создание, в качестве параметра метода:

private <E> ArrayList<E> getDataList(IntFunction<? extends E> fn) {

Тогда:

dataList.add(fn.apply(i));

И вызвать как:

List<Integer> integerList = getDataList(Integer::valueOf); // Same output as non-generic code.
List<String> stringList = getDataList(i -> "Item " + i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...