填充数组的通用方法

时间:2014-02-23 17:44:45

标签: java arrays generics

我正在学习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)

3 个答案:

答案 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];