带数组参数的通用方法?

时间:2014-09-24 23:05:49

标签: java arrays function generics methods

我想编写一个通用方法来打印我发送给它的任何类型的数组。我试过了

public static <T> void printArr(T[] a)
{
    int length = a.length;
    for(int i = 0; i < length; i++)
    {
    System.out.print(a[i] + " ");
    }       
}

但是当我尝试使用一组int时,它会给我一个错误,说明&#34;更改方法&#39; printArr(T [])&#39; to&#39; printArr(int [])&#39;。它是一种常规方法。有谁知道怎么做?

4 个答案:

答案 0 :(得分:0)

我猜你使用的是原始类型int但是在这里,需要一个Object的数组,所以你必须使用包装器Integer

print(new Integer[] { 1,2,3,4 });

答案 1 :(得分:0)

使用Java的泛型a generic type parameter must stand for an actual object type and not a primitive type。因此,您无法将int[](或任何其他基本类型的数组)传递给期望通用数组的方法。

您可以创建包装类型Integer[]的数组(或将现有的int[]复制到Integer[])并将其传递给printArr,否则您可以重载printArr接受int[]

答案 2 :(得分:0)

非常肯定你不能使用整数,因为任何使用泛型的方法都必须能够转换为一个对象,而int不是(它是一个基元)。如果你要提供一个整数数组,我相信它会正常工作。

Why don't Java Generics support primitive types?

答案 3 :(得分:0)

看看如何实现等效函数Arrays.toString()JavaDoc)。它的一个功能是Object[],例如Integer[],每种原始数组一个int[]。这是Object[]int[]版本的代码:

对象[]:

public static String toString(Object[] a) {
    if (a == null)
        return "null";

    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(String.valueOf(a[i]));
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

INT []:

public static String toString(int[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

从这段代码中可以学到很多东西。例如,它没有以任何方式使用泛型。

如果你真的想要创建一个可以接受任何数组的方法,那么它可能需要一个Object,然后你可以检查它的类,并调用相应的Arrays.toString()(或生成一个字符串手动)。然而,可能不是一个好主意。我们有超载是有原因的。

编辑: 只是为了好玩,这里有一个可以接受任何数组的方法。实际上,任何对象都可以。

public static void printAny(Object arr) {
    Class<?> cl = arr.getClass();
    if (cl.isArray()) {
        Class<?> type = cl.getComponentType();
        if (!type.isPrimitive()) {
            System.out.println(Arrays.toString((Object[]) arr));
        } else {
            switch (type.toString()) {
                case "int":
                    System.out.println(Arrays.toString((int[]) arr));
                    break;
            }
        }
    } else {
        System.out.println(arr);
    }
}