без изменения подписи метода:
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>
могут быть кошки и крокодилы