List <Integer>无法转换为ArrayList <Integer>

bee*_*tty 3 java list typeconverter

在我的代码的开头,有:

List<List<Integer>> result = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

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

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

有这种方法:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

List无法转换为ArrayList

为什么?

Cap*_*Man 10

可以这样想,你有一个Fruit被叫re(我使用这个名字,因为它是你正在使用的变量的名称).

Fruit re;
Run Code Online (Sandbox Code Playgroud)

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

public Apple reverse(Apple a) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

当你试图给出Fruit方法时Apple,编译器会阻止你,因为它不能确定它是100%的Apple.例如...

Fruit re = new Orange();
reverse(re);
Run Code Online (Sandbox Code Playgroud)

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

旁注:为什么然后分配Apple给那些声明的东西Fruit呢?(reverse返回Apple,Fruit f = reverse(re);是合法的.)因为a Apple a Fruit.如果它被声明为更具体Apple,返回类型更通用Fruit,那么这里就会出现问题.(如果reverse退回Fruit,Apple a = reverse(re);将是非法的.)

如果您没有遵循这个比喻,请替换FruitListApple,ArrayList并再次阅读上述内容.ListFruit描述抽象概念的一般方法.ArrayListApple,抽象概念的具体实现.(LinkedList可能Orange也是.)

一般而言,您希望将事物声明为获得所需功能的最常用的东西.进行以下更改应该可以解决您的问题.

public List<Integer> reverse(List<Integer> list) {
Run Code Online (Sandbox Code Playgroud)

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


Reu*_*ani 8

您正在使用List接口的特定实现作为reverse函数的返回类型(即ArrayList).这迫使你返回的是一个ArrayList,但你将它定义为List.

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

List<Integer> newList = new LinkedList<Integer>();
Run Code Online (Sandbox Code Playgroud)

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

所以现在你有两个选择:

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

ArrayList<Integer> newList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

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

public List<Integer> reverse(List<Integer> list){
Run Code Online (Sandbox Code Playgroud)