angel_30
angel_30

Reputation: 1

incompatible types: List<ArrayList<Integer>> cannot be converted to List<List<Integer>>

I'm trying to run the following code where it prints all subsets of a given set. It works when I change the return type of the subsets(int[] nums) function to ArrayList<ArrayList<Integer>> subsets(int[] nums), but not for List<List<Integer>> subsets(int[] nums). I need to have the return type as List<List<Integer>>. How should I fix it?

public class TestPractice {
    public static void main(String[] args){
        int[] x = {1,2};
        System.out.println(subsets(x));
    }
    
    public static List<List<Integer>> subsets(int[] nums) {
        List<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>();
        if (nums.length ==1){
            ArrayList<Integer> subset1 = new ArrayList<Integer>();
            ArrayList<Integer> subset2 = new ArrayList<Integer>();
            subset2.add(nums[0]);
            subsets.add(subset1);
            subsets.add(subset2);
            return subsets;
        }
        int[] nums_1 = new int[nums.length-1];
        for(int i = 0; i< nums.length-1; i++) {
        nums_1[i]=nums[i];
        }
        
        List<ArrayList<Integer>> subsets2= subsets(nums_1); 
        ArrayList<ArrayList<Integer>> final_set = new ArrayList<ArrayList<Integer>>(subsets2);
        
        for(ArrayList<Integer>subset: subsets2) {
            ArrayList<Integer> subset1 = new ArrayList<Integer>();
            subset1.add(nums[nums.length-1]);
            subset1.addAll(subset);
            final_set.add(subset1);
        }
        return final_set;
    }
}

Upvotes: 1

Views: 2064

Answers (1)

Sweeper
Sweeper

Reputation: 271040

See here for why you can't convert a List<ArrayList> to a List<List>.

To fix your error, on the other hand, you can simply not declare your variables as List<ArrayList<Integer>> and use List<List<Integer>> instead. You can do this because you are not using any members that only exists in ArrayList but not List. You also don't need to specify the generic arguments when instantiating a class, as they can be inferred.

public static List<List<Integer>> subsets(int[] nums) {
    // notice the change here!
    List<List<Integer>> subsets = new ArrayList<>();
    if (nums.length ==1){
        ArrayList<Integer> subset1 = new ArrayList<>();
        ArrayList<Integer> subset2 = new ArrayList<>();
        subset2.add(nums[0]);
        subsets.add(subset1);
        subsets.add(subset2);
        return subsets;
    }
    int[] nums_1 = new int[nums.length-1];
    for(int i = 0; i< nums.length-1; i++) {
        nums_1[i]=nums[i];
    }

    // notice the change here!
    List<List<Integer>> subsets2= subsets(nums_1);
    // notice the change here!
    ArrayList<List<Integer>> final_set = new ArrayList<>(subsets2);

    // notice the change here!
    for(List<Integer>subset: subsets2) {
        ArrayList<Integer> subset1 = new ArrayList<>();
        subset1.add(nums[nums.length-1]);
        subset1.addAll(subset);
        final_set.add(subset1);
    }
    return final_set;
}

Upvotes: 5

Related Questions