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);是合法的.)因为aApple是 aFruit.如果它被声明为更具体Apple,返回类型更通用Fruit,那么这里就会出现问题.(如果reverse退回Fruit,Apple a = reverse(re);将是非法的.)
如果您没有遵循这个比喻,请替换Fruit为List和Apple,ArrayList并再次阅读上述内容.List是Fruit描述抽象概念的一般方法.ArrayList是Apple,抽象概念的具体实现.(LinkedList可能Orange也是.)
一般而言,您希望将事物声明为获得所需功能的最常用的东西.进行以下更改应该可以解决您的问题.
public List<Integer> reverse(List<Integer> list) {
Run Code Online (Sandbox Code Playgroud)
我们正在采取某种List的IntegerS和返回某种List的Integer秒.
您正在使用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)
| 归档时间: |
|
| 查看次数: |
9847 次 |
| 最近记录: |