小编典典

清单 无法转换为ArrayList

java

在我的代码的开头,有:

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;
    }
}

错误消息是:

列表无法转换为ArrayList

为什么?


阅读 223

收藏
2020-11-19

共1个答案

小编典典

像这样想,您有一个Fruit调用re(我使用此名称,因为它是您正在使用的变量的名称)。

Fruit re;

您有一个reverse输入类型为的方法Apple

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

我们有一个re声明为的变量,Fruit这意味着我们要说它总是某种(Fruit也许Apple,但也许)Orange-甚至Banana

当您尝试Fruit将方法赋予方法时Apple,编译器会停止运行,因为无法确定它是100%an Apple。例如…

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

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

旁注: 为什么可以那样分配Apple给声明为Fruit那时的东西?(reverse返回an AppleFruit f = reverse(re);是合法的。)因为an Apple
一个Fruit。如果将其声明为更具体,Apple而将返回类型声明为更一般Fruit
此处将存在问题。(如果reverse返回FruitApple a = reverse(re);将是非法的。)

如果你没有按照比喻,
替换FruitList,并AppleArrayList以上再次读取。ListFruit,是描述抽象概念的一般方法。ArrayListApple,是抽象概念的特定实现。(LinkedList可能Orange也是。)

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

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

我们正在采取某种ListIntegerS和返回某种ListInteger秒。

2020-11-19