我正在学习java for school,主题是通用方法。我需要编写一个具有通用方法的应用程序来“填充”具有相同元素的任何类型的数组。但它没有用......任何人都可以帮助我:
package pack.switchshift;
import java.lang.reflect.Array;
public class Filler {
public static void main(String [] args) {
int[] intArr = new int[10];
String[] stringArr = new String[10];
double[] doubleArr = new double[10];
genFill(intArr, 0);
genFill(stringArr, "0");
genFill(doubleArr, 0.0);
for (int element : intArr){
System.out.print(element);
}
}
private static <T> void genFill(T[] arr, T element) {
for (int i = 0; i < arr.length; i++) {
arr[i] = element;
}
}
}
我尝试了多种方法并花了几个小时进行研究,但我仍然没有得到它。
线程“main”中的异常java.lang.Error:未解决的编译问题:
类型genFill(T[], T)
中的方法Filler
不适用于参数(int[], int)
类型genFill(T[], T)
中的方法Filler
不适用于pack.switchshift.Filler.main(Filler.java:11)中的参数(double[], double)
答案 0 :(得分:6)
泛型并不总是适用于原始类型(我写的总是因为你可以将原始int
类型传递给T
类型的参数。其中int
将自动装箱到Integer
)。您无法创建ArrayList<int>
,类似地,您无法传递int[]
或任何其他需要T[]
数组的基本类型数组。您必须传递Integer[]
。同样地,通过Double[]
代替double[]
。
可以这样想,泛型方法由编译器编译为类型擦除方法。在该过程中,此处的类型参数T
将被删除为最左边的Object
。因此,编译后的方法等同于:
private static void genFill(Object[] arr, Object element)
现在,您可以理解,您无法通过需要int[]
的{{1}}。
答案 1 :(得分:2)
查看Arrays.fill及其所有变体。
答案 2 :(得分:2)
只是不要使用原语。你可以这样做,因为T
实际上意味着某些对象将是
而不是T,所以你应该使用原始包装器。
Integer [] intArr = new Integer [10];
String [] stringArr = new String[10];
Double [] doubleArr = new Double [10];