2015-07-31 2 views
2

В начале моего кода, есть:Список <Integer> не может быть преобразован в ArrayList <Integer>

List<List<Integer>> result = new ArrayList(); 

И тогда, (здесь, чтобы отменить подсписок):

List<Integer> sub = new ArrayList(); 
re = reverse(result.get(j)); // error occurs here 

Там этот метод:

public ArrayList<Integer> reverse(ArrayList<Integer> list) { 
    List<Integer> newList = new ArrayList<>(); 

    for(int i=list.size()-1; i>=0; i--) { 
     newList.add(list.get(i));} 
     return newList; 
    } 
} 

сообщение об ошибке:

Список не может быть преобразован в ArrayList

Почему?

+1

Как декларируется 're'? Имейте в виду, что «Список» не является «ArrayList», но совершенно верно. – Makoto

+0

Список - это интерфейс, ArrayList - это один из классов, который реализует интерфейс List. Таким образом, любой ArrayList представляет собой List (то есть ArrayList может быть неявно назначен List), но не наоборот. Либо измените тип возврата на список , либо измените тип переменной newList на ArrayList . Кстати, переместите «возврат» из тела петли. – AterLux

+0

Не используйте необработанный тип 'ArrayList'. Используйте 'new ArrayList <>();' вместо 'new ArrayList();'. – Jesper

ответ

9

Думайте об этом, как это, у вас есть 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! Мы помещаем квадратную скобу в круглое отверстие, так сказать. (Япония) reverseApple, а не 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 с.

+0

О, хорошо. Понимаю. Большое спасибо! Мне нравится ваш симпатичный пример! – beepretty

8

Вы используете конкретную реализацию интерфейса List в качестве возвращаемого типа для функции(а именно ArrayList). Это заставляет вас вернуть ArrayList, но вы определяете его как List.

Чтобы понять, попытаться изменить строительную часть, чтобы использовать LinkedList, который также реализует List:

List<Integer> newList = new LinkedList<Integer>(); 

Эта конструкция действует, но сейчас мы пытаемся вернуть LinkedList из функции, которая возвращает ArrayList , Это не имеет смысла, поскольку они не связаны (но обратите внимание на это: оба они реализуют List).

Так что теперь у вас есть два варианта:

сделать реализацию более конкретным путем принуждать использование ArrayList с:

ArrayList<Integer> newList = new ArrayList<>(); 

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

public List<Integer> reverse(List<Integer> list){ 
+0

Спасибо вам большое! Очень полезно! – beepretty

1

It» потому, что ваш результат varible имеет типа списка, но ваш метод хочет, ArrayList Попробуйте с:

List<ArrayList<Integer> result = new ArrayList<>(); 

или изменить функцию:

public List<Integer> reverse(List<Integer> list){... 
+0

ОК. Понял. Спасибо за ваш простой, но ясный ответ! – beepretty

Смежные вопросы