如何在 Java 中将任何数组作为参数传递?

How to pass any array as a parameter in Java?

我如何编写一个方法来接受任何类型的数组(包括基元)作为参数?

例如,我希望以下两个调用都能正常工作:

int[] intArray = {1, 2, 3};
String[] strArray = {"1", "2"};

hasSize(intArray, 3);
hasSize(strArray, 2);

到目前为止我得到的最接近的是:

public static <T> boolean hasSize(T[] array, int expectedSize)
{
    return (array.length == expectedSize);
}

...但这不适用于原语。

如果我没记错的话,你不能创建一个你希望有基元的泛型数组,因为基元本身不是 类 并且对 Java 泛型系统不可用。

相反,您的传入数组必须是 Integer[]、Double[] 等

不共享的原始数组和对象数组是基 class 除了 Object

所以唯一的可能性是接受一个对象并在方法内部检查它是否是一个数组

public static <T> boolean hasSize(Object x, int expectedSize)
{
    return (x != null) && x.getClass().isArray() ?
        java.lang.reflect.Array.getLength(x) == expectedSize :
        false;
}

当然这也接受非数组,可能不是你想要的解决方案。

出于这个原因,JDK 主要为对象数组和原始数组提供相同的方法。

你可以这样做

public class A {

    public static void main (String[] args) {

        int[] intArray = {1, 2, 3};
        String[] strArray = {"1", "2"};

        hasSize(Arrays.asList(intArray), 3);
        hasSize(Arrays.asList(strArray), 2);
    }

    public static <T> boolean hasSize(List<T> array, int expectedSize)
    {
        return (array.size() == expectedSize);
    }
}

这不是您想要的。但是您可以通过将数组传递给列表来利用通用机制,自动装箱会为您完成工作。

如果这种方法适合你,那没问题,但不幸的是,如果这不是一个好方法,泛型机制不支持原始类型,所以你必须为每个数组类型重写该方法。

如上所述,你不能混合原始数组和对象数组,你必须使用包装器 class 。 如果函数将除变量参数外,那么一种编写方式是使用 vargs 概念

public static <T> void process(T...args) {
    System.out.println(Arrays.toString(args));
}

此概念用于 java 内部 API