ошибка: несовместимые типы: список <Integer>не может быть преобразован в ArrayList <Integer> - PullRequest
0 голосов
/ 18 мая 2018

Я нашел несколько вопросов, похожих на проблему, с которой я столкнулся, но я не смог найти решение.Пример: Несовместимые типы Список списков и ArrayList из ArrayList , Не в состоянии понять, как определить список списков в Java

Программа должна вернуть список списков,Итак, я объявил список списков, а затем пытался добавить к нему массивы.

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

Но, когда я пытаюсь получить доступ к каждому элементу массива из списка списков, как показано ниже, я получаю сообщение об ошибке: incompatible types: List<Integer> cannot be converted to ArrayList<Integer>

for(ArrayList<Integer> subset:allsubsets)

Когда я пытаюсь преобразоватьстрока в for(List<Integer> subset:allsubsets), выдает ошибку, что add, addAll не существует для типа List, что имеет смысл.Пожалуйста, помогите мне понять, как получить доступ к элементам списка списков в этом случае.

public List<List<Integer>> subsets(int[] nums) {
    List<Integer> arrayList = new ArrayList<Integer>();
    for(int i:nums) {
        arrayList.add(i);
    }
    return subsets(arrayList,nums.length);
}

public List<List<Integer>> subsets(List<Integer> arrayList, int index) {
    List<List<Integer>> allsubsets;
    if(index == -1) {
         allsubsets = new ArrayList<List<Integer>>();
         allsubsets.add(new ArrayList<Integer>());
    }
    else {
        allsubsets = subsets(arrayList, index-1);
        int item = arrayList.get(index);
        List<List<Integer>> moresubsets =  new ArrayList<List<Integer>>();
        for(ArrayList<Integer> subset:allsubsets) { 
        //The line above throws error as I created list of lists

            List<Integer> newsubset = new ArrayList<Integer>(); //create new subset
            newsubset.addAll(subset); // add all old items
            newsubset.add(item); // add new item
            moresubsets.add(newsubset); //add subset to moresubsets
        }
        allsubsets.add(moresubsets); // add to actual one
    }
  return allsubsets;
}

Примечание: если я изменяю тип возвращаемого значения на arraylist of arraylist, он работает для меня.Но я хочу, чтобы он работал для списка списков

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Давайте попробуем расширить этот расширенный цикл for на более базовые компоненты:

for(ArrayList<Integer> subset:allsubsets) { 
    //The line above throws error as I created list of lists
}

// this is roughly equivalent to 
Iterator<List<Integer>> it = allsubsets.iterator();
while(it.hasNext()) {
    ArrayList<Integer> subset = it.next(); // Error
    // Since the iterator was defined as an iterator to a List<List<Integer>>,
    // it.next() will return the next element in allsubsets
    // which happens to be an List<Integers>.
    // You can't assign a reference of a parent type to a child. However 
    // the opposite is perfectly fine, assigning a reference of a child type
    // to a parent.

    // If we change subset to be a List<Integer> i.e.
    // for(List<Integer> subset : allsubsets)
    // then we are assigning a reference of a List<Integer> to a List<Integer> 
    // so no problem.
}
0 голосов
/ 18 мая 2018

Я предпочитаю поделиться с вами кодом, который я сделал для управления списком объектов того же типа, который вы пытаетесь обработать.Надеюсь, это поможет.

    public static void main(String[] args) {

    List<List<Integer>> allsubsets = setSubsets();

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

    allsubsets2.addAll(allsubsets);
    int i= 0;
    for (List<Integer> test : allsubsets2) {
        System.out.println(i + " Lista");
        for (Integer integer : test) {
            System.out.println(integer);
        }
        i++;
    } 
}
public static List<List<Integer>> setSubsets() {
    List<List<Integer>> allsubsets = new ArrayList<List<Integer>>();
    List<Integer> listInteger1 = new ArrayList<>();
    List<Integer> listInteger2 = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        listInteger1.add(i);
    }
    for (int i = 1010; i < 1110; i++) {
        listInteger2.add(i);
    }
    allsubsets.add(listInteger1);
    allsubsets.add(listInteger2);
    return allsubsets;
}
0 голосов
/ 18 мая 2018

Правильный способ итерации вашего списка должен быть:

    for(List<Integer> subset:allsubsets) { 

вместо:

    for(ArrayList<Integer> subset:allsubsets) { 

List<List<Integer>> allsubsets объявлен как список списка, но реализация неизвестна.

Только вы знаете, что тип вложенного List равен ArrayList, поэтому либо измените foreach на List<Integer>, либо вручную приведите List<Integer> к ArrayList<> (это не является предпочтительным)

Еще одна вещь:

    allsubsets.add(moresubsets); // add to actual one

Попытка добавить список List (List<List<Integer>>) в качестве элемента, который должен быть List<Integer>, следовательно, ошибка компиляции.

Измените это утверждение на:

  allsubsets.addAll(moresubsets);
...