Использование дженериков для умножения коллекции - PullRequest
0 голосов
/ 13 октября 2019

Я должен написать метод, который принимает аргументы Список и int n .

Метод должен умножать содержимое заданного Список в том же Список . Если n = 0, тогда Список должен быть пустым. Если n = 1, Список должен быть таким же, как и раньше.

Для Пример :

List<Integer> list = Arrays.asList(1,2,3);
multiply(list, 2);
System.out.println(list);

желаемый вывод :

[1,2,3,1,2,3]

Подпись метода изменить нельзя :

public static void multiply(List<?> list, int n) {

}

Я пробовал это:

public static void multiply(List<?> list, int n) {

        List<? super Object> copy = new ArrayList<>();

        if (n == 0) {
            list.clear();
        }

        for (int i = 1; i <= n; i++) {
            copy.addAll(list);         
        }

        list.clear();
        list.addAll(copy); // this is not allowed
    }

Спасибо за советы!

1 Ответ

0 голосов
/ 13 октября 2019

без изменения подписи метода:

public static void multiply(List<?> list, int n) {
    if (n == 0) {
        list.clear();
        return;
    }
    @SuppressWarnings("unchecked")
    List<Object> oldSchool = (List<Object>) list;
    List<?> copy = new ArrayList<>(list);
    for (int i = 1; i < n; i++) {
        oldSchool.addAll(copy);
    }
}

(мне пришлось преобразовать список в List<Object>)

с изменением подписи (используя просто обычный T для универсального параметра):

public static <T> void multiply(List<T> list, int n) {
    List<T> copy = new ArrayList<>();

    if (n == 0) {
        list.clear();
    }

    for (int i = 1; i <= n; i++) {
        copy.addAll(list);
    }

    list.clear();
    list.addAll(copy); // this is now OK
}

сейчас, а также почему ваш исходный код не скомпилирован:

list по существу List<some unknown class>, и copy как List<some PARENT of that unknown class>

затем вы пытаетесь добавить содержимое copy в list.

это все равно что пытаться сбросить содержимое List<Animal> в List<Dog> - они не подходят, потому что в List<Animal>

могут быть кошки и крокодилы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...