Java 列表<;整数>;无法转换为ArrayList<;整数>;
在我的代码开头,有:Java 列表<;整数>;无法转换为ArrayList<;整数>;,java,list,typeconverter,Java,List,Typeconverter,在我的代码开头,有: List<List<Integer>> result = new ArrayList(); List result=new ArrayList(); 然后,(这里是反转子列表): List sub=new ArrayList(); re=反向(result.get(j));//这里发生错误 有这样一种方法: public ArrayList<Integer> reverse(ArrayList<Integer> list
List<List<Integer>> result = new ArrayList();
List result=new ArrayList();
然后,(这里是反转子列表):
List sub=new ArrayList();
re=反向(result.get(j));//这里发生错误
有这样一种方法:
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反向(ArrayList列表){
List newList=newarraylist();
对于(int i=list.size()-1;i>=0;i--){
newList.add(list.get(i));}
返回newList;
}
}
错误消息是:
无法将列表转换为ArrayList
为什么?您正在使用
列表
接口的特定实现作为反向
函数的返回类型(即数组列表
)。这将强制您返回一个数组列表
,但您将其定义为列表
要理解,请尝试将构造部分更改为使用链接列表
,该列表也实现了列表
:
List<Integer> newList = new LinkedList<Integer>();
或更好,通过更改函数的返回类型(可以插入任何列表
),使实现更通用:
公共列表反向(列表){
这是因为您的结果变量有一种列表类型,但您的方法需要一个ArrayList
尝试以下方法:
List<ArrayList<Integer> result = new ArrayList<>();
List这样想,您有一个名为re
的水果(我使用这个名称是因为它是您正在使用的变量的名称)
您有一个方法reverse
,其输入类型为Apple
public Apple reverse(Apple a) {
// ...
}
我们有一个变量re
,我们称之为水果
,这意味着它总是某种水果
,可能是苹果
,但可能是橙色
——甚至是香蕉
当您尝试将结果
赋予采用Apple
的方法时,编译器会阻止您,因为它无法确定它是100%的Apple
。例如
Fruit re = new Orange();
reverse(re);
哎呀!可以说,我们是在把一个方形的钉子插进一个圆孔。反向
取的是苹果
,而不是橙色
。坏事可能会发生
旁注:那么为什么可以将Apple
分配给声明为水果的东西呢?(reverse
返回一个Apple
,水果f=reverse(re);
是合法的。)因为Apple
是水果
。如果它被声明为更具体的Apple
,并且返回类型是更通用的水果
,那么这里就有一个问题。(如果反向
返回的水果
,苹果a=反向(re)
将是非法的。)
如果您没有遵循隐喻,请用List
替换Fruit
,用ArrayList
替换Apple
,然后再次阅读上述内容。List
是Fruit
,一种描述抽象概念的一般方式。ArrayList
是Apple
,abs的具体实现tract idea.(LinkedList
也可以是Orange
)
一般来说,您希望将事物声明为获得所需功能的最通用的事物。进行以下更改应该可以解决您的问题
public List<Integer> reverse(List<Integer> list) {
公共列表反向(列表){
我们正在获取某种类型的List
ofInteger
s,并返回某种类型的List
ofInteger
s.如何声明re
呢?请记住List
不是ArrayList
,但恰恰相反。List是接口,ArrayList是实现的类之一设置列表接口。因此,任何ArrayList都是List(即ArrayList可以隐式分配给List),但反之亦然。将返回类型更改为List,或将newList变量类型更改为ArrayList。顺便说一下,将“return”移出循环体。不要使用原始类型ArrayList
。使用新建ArrayList();
而不是新的ArrayList();
。哦,好的。我明白了。非常感谢!我喜欢你可爱的例子!好的。明白了。谢谢你简单明了的回答!非常感谢!非常有用!
public List<Integer> reverse(List<Integer> list){...
Fruit re;
public Apple reverse(Apple a) {
// ...
}
Fruit re = new Orange();
reverse(re);
public List<Integer> reverse(List<Integer> list) {