具有不兼容类型的Java集合错误

时间:2014-08-20 18:53:40

标签: java collections arraylist

所以我有这个功能,而且它没有编译。问题是什么?

编译错误是 第4行:错误:不兼容的类型

public List<List<Integer>> myfunc(int[] num) {

        List<List<Integer>> r = new ArrayList<ArrayList<Integer>>();  //line 4
        return r;
}

谢谢!

3 个答案:

答案 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的类型匹配。