所以我有这个功能,而且它没有编译。问题是什么?
编译错误是 第4行:错误:不兼容的类型
public List<List<Integer>> myfunc(int[] num) {
List<List<Integer>> r = new ArrayList<ArrayList<Integer>>(); //line 4
return r;
}
谢谢!
答案 0 :(得分:1)
编译器将声明的List
的元素类型与创建的ArrayList
实例的元素类型进行匹配。它们应该是一样的:
List<ArrayList<Integer>> r = new ArrayList<ArrayList<Integer>>();
或
List<List<Integer>> r = new ArrayList<List<Integer>>();
第二个更好,因为元素类型是一个接口。
答案 1 :(得分:1)
ArrayList<ArrayList<Integer>>
不是List<List<Integer>>
,原因与ArrayList<Apple>
不是List<Fruit>
的原因相同,并且很容易举例说明为什么就是这样:
ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<ArrayList<Integer>>();
// This won't work, but imagine that it did...
List<List<Integer>> lists = arrayLists;
// This is fine - a LinkedList<Integer> is a List<Integer>
lists.add(new LinkedList<Integer>());
// This should be fine too
ArrayList<Integer> arrayList = arrayLists.get(0);
那么最后一行会发生什么?不知何故,arrayList
会引用LinkedList
,即使其类型为ArrayList<Integer>
。 EEK!
这证明了为什么代码在被允许时不安全的原因 - 这就是为什么不允许的原因。一个更简单的例子是我前面提到的水果:
List<Apple> apples = new List<Apples>();
// Again, not allowed
List<Fruit> fruit = apples;
// Because this would be odd...
fruit.Add(new Banana());
// It's a Banapple!
Apple apple = apples.get(0);
您可以在这里做各种事情 - 但最简单的可能只是创建一个ArrayList<List<Integer>>
而不是ArrayList<ArrayList<Integer>>
。
答案 2 :(得分:-1)
声明的列表类型应该与您尝试创建的ArrayList的类型匹配。