我一直在研究一个学校项目,该项目需要(或至少强烈建议)在Java中使用二维ArrayLists(特别是一个包含int
s的ArrayList的ArrayList。我发现语法太难掌握,但下面的代码确实难以理解:
List<ArrayList<Integer>> arrList2D = new ArrayList<>();
List<Integer> arrList1D = new ArrayList<>();
arrList1D.add(1);
arrList2D.add(arrList1D);
该片段给出了错误:
Cannot convert List<Integer> to ArrayList<Integer>
就在最后一行。我觉得令人困惑的是我明确地将arrList1D
实例化为ArrayList。我有什么明显的遗失吗?非常感谢任何帮助。对于任何多余的问题,我们深表歉意。
答案 0 :(得分:2)
List<Integer> arrList1D = new ArrayList<>();
在创建ArrayList
类型的新Integer
对象时,可以使用List
变量来引用Object。就编译器所知,Object arrList1D
引用的是List,而不是ArrayList。 ArrayList 扩展列表,这样每个ArrayList
都是List
,但不是每个List
都是ArrayList
。当您尝试将List
对象添加到仅接受ArrayList
对象More on Java Inheritance.
您需要确保arrList1D
变量引用ArrayList
或“2D列表”的类型为List,而不是ArrayList。
List<List<Integer>> arrList2D = new ArrayList<>();
List<Integer> arrList1D = new ArrayList<>();
arrList1D.add(1);
arrList2D.add(arrList1D);
或
List<ArrayList<Integer>> arrList2D = new ArrayList<>();
ArrayList<Integer> arrList1D = new ArrayList<>();
arrList1D.add(1);
arrList2D.add(arrList1D);
答案 1 :(得分:0)
所以你看到的错误是因为arrList1D的类型为List
,这意味着它可以是任何List实现(尽管你已经选择了ArrayList)。
将arrList2D声明为List<ArrayList<Integer>>
的位置此情况下的内部列表必须显式为ArrayList类型。
有两种方法可以使编译将arrList1D的类型更改为ArrayList
List<ArrayList<Integer>> arrList2D = new ArrayList<>();
ArrayList<Integer> arrList1D = new ArrayList<>();
arrList1D.add(1);
arrList2D.add(arrList1D);
或者更改arrList2D的内部类型以使用List。
List<List<Integer>> arrList2D = new ArrayList<>();
List<Integer> arrList1D = new ArrayList<>();
arrList1D.add(1);
arrList2D.add(arrList1D);
我建议使用第二个选项,因为它可以让您灵活地自由更改内部或外部List实现。