繁体   English   中英

名单 <Integer> 无法转换为ArrayList <Integer>

[英]List<Integer> cannot be converted to ArrayList<Integer>

在我的代码的开头,有:

List<List<Integer>> result = new ArrayList();

然后,(这里是反转一个子列表):

List<Integer> sub = new ArrayList();
re = reverse(result.get(j)); // error occurs here

有这种方法:

public ArrayList<Integer> reverse(ArrayList<Integer> list) {
    List<Integer> newList = new ArrayList<>();

    for(int i=list.size()-1; i>=0; i--) {
        newList.add(list.get(i));}
        return newList;
    }
}

错误消息是:

List无法转换为ArrayList

为什么?

想象一下,你有一个名为reFruit (我使用这个名字,因为它是你正在使用的变量的名称)。

Fruit re;

你有一个方法reverse其输入类型是Apple

public Apple reverse(Apple a) {
    // ...
}

我们有一个变量re我们宣称为Fruit ,这意味着我们说它总是会成为某种Fruit ,也许是Apple ,但也许是Orange - 甚至是Banana

当你尝试将Fruit用于采用Apple的方法时,编译器会阻止你,因为它无法确定它是100%的Apple 例如...

Fruit re = new Orange();
reverse(re);

哎呀! 我们正在将一个方形钉子放入一个圆孔中,可以这么说。 reverse需要Apple ,而不是Orange 坏事可能发生!

旁注:为什么将Apple分配给宣称为Fruit东西呢? reverse返回AppleFruit f = reverse(re);合法。)因为Apple Fruit 如果它被宣布为更具体的Apple ,而返回类型是更普遍的Fruit那么这里就会出现问题。 (如果reverse返回FruitApple a = reverse(re);将是非法的。)

如果你没有按照这个比喻,List替换Fruit with List ,用ArrayList替换Apple ,再读上面的内容。 ListFruit ,一种描述抽象概念的一般方式。 ArrayListApple ,是抽象概念的具体实现。 LinkedList也可能是Orange 。)

通常,您希望将事物声明为获得所需功能的最常用的事物。 进行以下更改应该可以解决您的问题。

public List<Integer> reverse(List<Integer> list) {

我们正在使用某种List of Integer并返回某种Integer List

您正在使用List接口的特定实现作为reverse函数的返回类型(即ArrayList )。 这会强制您返回的是ArrayList ,但您将其定义为List

要理解,请尝试更改构造部件以使用LinkedList ,它也实现List

List<Integer> newList = new LinkedList<Integer>();

这种结构是有效的,但现在我们尝试从返回ArrayList的函数返回一个LinkedList 这没有任何意义,因为它们没有关联(但请注意:它们都实现了List )。

所以现在你有两个选择:

通过强制使用ArrayList使实现更具体:

ArrayList<Integer> newList = new ArrayList<>();

或者更好 ,通过更改函数的返回类型(可以插入任何List )使实现更通用:

public List<Integer> reverse(List<Integer> list){

这是因为你的结果varible有一个List类型,但是你的方法需要一个ArrayList尝试使用:

List<ArrayList<Integer> result = new ArrayList<>();

改变你的功能:

public List<Integer> reverse(List<Integer> list){...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM