我尝试使用递归打印 N 到 1。但是在这样做时,我收到以下错误我应该在代码中更改什么才能成功将 ArrayList 转换为数组
这是代码-->
import java.util.ArrayList;
class HelloWorld {
static ArrayList<Integer> ar = new ArrayList<>();
public static int[] printNos(int x) {
// Write Your Code Here
if(x>0){
ar.add(x);
printNos(x-1);
}
int [] arr = new int[ar.size()];
arr = ar.toArray(arr);
return arr;
}
public static void main(String[] args) {
int [] ark = printNos(5);
for(Interger e: ark){
System.out.print(e);
}
}
}
出现以下错误-->
错误!
javac /tmp/kEUqQIfOZV/HelloWorld.java
/tmp/kEUqQIfOZV/HelloWorld.java:11: error: no suitable method found for toArray(int[])
arr = ar.toArray(arr);
^
method Collection.<T#1>toArray(IntFunction<T#1[]>) is not applicable
(cannot infer type-variable(s) T#1
(argument mismatch; int[] cannot be converted to IntFunction<T#1[]>))
method ArrayList.<T#2>toArray(T#2[]) is not applicable
(inference variable T#2 has incompatible bounds
equality constraints: int
lower bounds: Object)
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>toArray(IntFunction<T#1[]>)
T#2 extends Object declared in method <T#2>toArray(T#2[])
/tmp/kEUqQIfOZV/HelloWorld.java:18: error: cannot find symbol
for(Interger e: ark){
^
symbol: class Interger
location: class HelloWorld
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors
在这里我知道第二个错误是由于第一个错误而发生的,我也可以使用各种其他方法解决这个问题,但我想了解的是为什么这段代码中的ArrayList没有转换为数组并抛出错误以及发生了什么变化我必须做什么才能避免这个错误?
问题是:
int [] arr = new int[ar.size()];
arr = ar.toArray(arr);
^^^^^^^
T[] toArray(T[] a) 返回一个数组,其中按正确顺序(从第一个元素到最后一个元素)包含此列表中的所有元素;返回数组的运行时类型是指定数组的运行时类型。
所以它使用java泛型,泛型适用于对象类型而不是基元,因此T不能是int。
要修复此问题,您可以在代码中将
int []
更改为 Integer []
。或者使用一些惯用的转换代码,如这个答案:如何将包含整数的 ArrayList 转换为原始 int 数组?
...你的第二个错误是拼写错误:
for(Interger e: ark){
^ ~~~~ !
ArrayList 是 Java 中 Collection 框架的一部分。 arrayList.toArray() 方法返回 Object 类型的数组,可以是 Java 中任何类型的 Wrapper 类。
答案:您试图将 toArray() 方法的输出分配给导致错误的基本类型 (int[])。使用包装类 Integer 可以修复第一个错误。第二个错误只是一个拼写错误。