在我的代码的开头,有:
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
为什么?
像这样想,您有一个Fruit调用re(我使用此名称,因为它是您正在使用的变量的名称)。
Fruit
re
Fruit re;
您有一个reverse输入类型为的方法Apple。
reverse
Apple
public Apple reverse(Apple a) { // ... }
我们有一个re声明为的变量,Fruit这意味着我们要说它总是某种(Fruit也许Apple,但也许)Orange-甚至Banana。
Orange
Banana
当您尝试Fruit将方法赋予方法时Apple,编译器会停止运行,因为无法确定它是100%an Apple。例如…
Fruit re = new Orange(); reverse(re);
kes!可以这么说,我们正在将一个方形的钉子插入一个圆孔中。reverse需要Apple,不是Orange。可能发生坏事!
旁注: 为什么可以那样分配Apple给声明为Fruit那时的东西?(reverse返回an Apple,Fruit f = reverse(re);是合法的。)因为an Apple 是 一个Fruit。如果将其声明为更具体,Apple而将返回类型声明为更一般Fruit, 则 此处将存在问题。(如果reverse返回Fruit,Apple a = reverse(re);将是非法的。)
Fruit f = reverse(re);
Apple a = reverse(re);
如果你没有按照比喻, 替换Fruit用List,并Apple与ArrayList以上再次读取。List是Fruit,是描述抽象概念的一般方法。ArrayList是Apple,是抽象概念的特定实现。(LinkedList可能Orange也是。)
List
ArrayList
LinkedList
通常,您希望将事物声明为可以获取所需功能的最通用事物。进行以下更改应该可以解决您的问题。
public List<Integer> reverse(List<Integer> list) {
我们正在采取某种List的IntegerS和返回某种List的Integer秒。
Integer