Думайте об этом, как это, у вас есть Fruit
под названием re
(я использую это имя, потому что это имя используемой переменной).
Fruit re;
У вас есть метод reverse
, чей вход тип Apple
.
public Apple reverse(Apple a) {
// ...
}
Мы имеем переменную re
что мы задекларирован как Fruit
, что означает, что мы говорим, что это всегда будет какая-то Fruit
, возможно Apple
, но, возможно, Orange
- или даже Banana
.
Когда вы пытаетесь дать Fruit
методу, принимающему Apple
, компилятор останавливает вас, потому что он не может быть уверен, что это 100% Apple
. Например ...
Fruit re = new Orange();
reverse(re);
Yikes! Мы помещаем квадратную скобу в круглое отверстие, так сказать. (Япония) reverse
Apple
, а не Orange
. Плохие вещи могут случиться!
примечание стороны: Почему это хорошо, то присвоить Apple
к чему-то объявлен как Fruit
тогда? (reverse
возвращает Apple
, Fruit f = reverse(re);
является законным.) Поскольку Apple
является a Fruit
. Если бы он был объявлен как более конкретный Apple
, а тип возврата был более общим Fruit
, , то здесь была проблема. (Если reverse
вернулся Fruit
, Apple a = reverse(re);
будет незаконным.)
Если вы не следовать метафоре, заменить Fruit
с List
и Apple
с ArrayList
и прочитать выше снова. List
- Fruit
, общий способ описания абстрактной идеи. ArrayList
- Apple
, конкретная реализация абстрактной идеи. (LinkedList
может быть Orange
тоже.)
В общем, вы хотите заявить, что самое общее, что вы можете, чтобы получить необходимую вам функциональность. Выполнение нижеуказанного изменения должно устранить вашу проблему.
public List<Integer> reverse(List<Integer> list) {
Мы принимаем какие-то List
из Integer
с и возвращение своего рода List
в Integer
с.
Как декларируется 're'? Имейте в виду, что «Список» не является «ArrayList», но совершенно верно. – Makoto
Список - это интерфейс, ArrayList - это один из классов, который реализует интерфейс List. Таким образом, любой ArrayList представляет собой List (то есть ArrayList может быть неявно назначен List), но не наоборот. Либо измените тип возврата на список, либо измените тип переменной newList на ArrayList . Кстати, переместите «возврат» из тела петли. –
AterLux
Не используйте необработанный тип 'ArrayList'. Используйте 'new ArrayList <>();' вместо 'new ArrayList();'. – Jesper