java List<Integer> 不能转换为 ArrayList<Integer>
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31754638/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
List<Integer> cannot be converted to ArrayList<Integer>
提问by beepretty
At the beginning of my code, there is:
在我的代码的开头,有:
List<List<Integer>> result = new ArrayList();
And then, (here is to reverse a sub-list):
然后,(这里是反转一个子列表):
List<Integer> sub = new ArrayList();
re = reverse(result.get(j)); // error occurs here
There is this method:
有这个方法:
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;
}
}
The error message is:
错误信息是:
List cannot be converted to ArrayList
列表无法转换为 ArrayList
Why?
为什么?
回答by Captain Man
Think of it like this, you have a Fruit
called re
(I use this name because it's the name of the variable you are using).
可以这样想,您有一个Fruit
调用re
(我使用这个名称是因为它是您正在使用的变量的名称)。
Fruit re;
You have a method reverse
whose input type is Apple
.
您有一个reverse
输入类型为的方法Apple
。
public Apple reverse(Apple a) {
// ...
}
We have a variable re
that we declared as Fruit
which means we're saying it's always going to be some kind of Fruit
, perhaps Apple
, but maybe Orange
-- or even Banana
.
我们有一个re
我们声明为的变量,Fruit
这意味着我们说它总是会是某种Fruit
,也许是Apple
,但也许Orange
- 甚至是Banana
。
When you try to give the Fruit
to the method taking Apple
the compiler stops you, because it can't be certain that it's 100% an Apple
. For example...
当您尝试给予Fruit
服用方法Apple
编译器停止你,因为它不能确定它是100%的Apple
。例如...
Fruit re = new Orange();
reverse(re);
Yikes! We are putting a square peg into a round hole so to speak. reverse
takes Apple
, not Orange
. Bad things could happen!
哎呀!可以这么说,我们正在将一个方钉插入一个圆孔中。reverse
需要Apple
,不是Orange
。可能会发生不好的事情!
Side note:Why is it okay then to assign
Apple
to something declared asFruit
then? (reverse
returns anApple
,Fruit f = reverse(re);
is legal.) Because anApple
isaFruit
. If it were declared as the more specificApple
and the return type were the more generalFruit
, thenthere would be an issue here. (Ifreverse
returnedFruit
,Apple a = reverse(re);
would be illegal.)
旁注:为什么可以分配
Apple
给那样声明的东西Fruit
?(reverse
返回 anApple
,Fruit f = reverse(re);
是合法的。)因为 anApple
是aFruit
。如果它被声明为更具体的Apple
并且返回类型更通用Fruit
,那么这里就会出现问题。(如果reverse
返回Fruit
,Apple a = reverse(re);
将是非法的。)
If you didn't follow the metaphor,replace Fruit
with List
and Apple
with ArrayList
and read the above again. List
is Fruit
, a general way to describe an abstract idea. ArrayList
is Apple
, a specific implementation of the abstract idea. (LinkedList
could be Orange
too.)
如果你没有按照比喻,替换Fruit
用List
,并Apple
与ArrayList
以上再次读取。List
是Fruit
,描述抽象思想的一般方式。ArrayList
是Apple
,抽象思想的具体实现。(LinkedList
也可能是Orange
。)
In general you want to declare things as the most general thing you can to get the functionality you need. Making the below change should fix your problem.
通常,您希望将事物声明为获得所需功能的最一般事物。进行以下更改应该可以解决您的问题。
public List<Integer> reverse(List<Integer> list) {
We are taking some kind of List
of Integer
s and returning some kind of List
of Integer
s.
我们正在采取某种List
的Integer
S和返回某种List
的Integer
秒。
回答by Reut Sharabani
You're using a specific implementation of the List
interface as a return type for the reverse
function (namely ArrayList
). This forces what you return to be an ArrayList
, but you're defining it as List
.
您正在使用List
接口的特定实现作为reverse
函数的返回类型(即ArrayList
)。这会强制您返回的内容为ArrayList
,但您将其定义为List
。
To understand, try and change the construction part to use a LinkedList
, which also implements List
:
要理解,请尝试将构造部分更改为使用 a LinkedList
,它还实现了List
:
List<Integer> newList = new LinkedList<Integer>();
This construction is valid, but now we try and return a LinkedList
from a function that returns an ArrayList
. This makes no sense since they aren't related (But notice this: they both implement List
).
这种构造是有效的,但现在我们尝试LinkedList
从返回 a的函数中返回 a ArrayList
。这是没有意义的,因为它们不相关(但请注意:它们都实现了List
)。
So now you have two options:
所以现在你有两个选择:
Make the implementation more specific by forcing use of ArrayList
s:
通过强制使用ArrayList
s使实现更加具体:
ArrayList<Integer> newList = new ArrayList<>();
Or better, make the implementation more general by changing the function's return type (any List
can be plugged in):
或者更好的是,通过更改函数的返回类型(List
可以插入任何类型)使实现更通用:
public List<Integer> reverse(List<Integer> list){
回答by StansTec
It's because your result varible has a type of List, but your method want an ArrayList Try it with:
这是因为你的结果变量有一个 List 类型,但你的方法想要一个 ArrayList 试试看:
List<ArrayList<Integer> result = new ArrayList<>();
orchange your function in:
或更改您的功能:
public List<Integer> reverse(List<Integer> list){...