不兼容的类型:List<ArrayList<Integer>> 不能转换为 List<List<Integer>>

Tin*_*a J 1 java arraylist

我正在尝试运行以下代码,它打印给定集合的所有子集。当我将subsets(int[] nums)函数的返回类型更改为ArrayList<ArrayList<Integer>> subsets(int[] nums),但不适用于List<List<Integer>> subsets(int[] nums). 我需要将返回类型设为List<List<Integer>>. 我该如何解决?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

请参阅此处了解为什么无法将 a 转换List<ArrayList>为 a List<List>

另一方面,要修复您的错误,您可以简单地将变量声明为List<ArrayList<Integer>>并使用List<List<Integer>>。您可以这样做,因为您没有使用任何仅存在于 中ArrayList但不存在于 中的成员List。您也不需要在实例化类时指定泛型参数,因为它们可以被推断出来。

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;
}
Run Code Online (Sandbox Code Playgroud)