Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何将任何数组作为参数传递?_Java_Arrays_Parameters - Fatal编程技术网

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

在Java中如何将任何数组作为参数传递?,java,arrays,parameters,Java,Arrays,Parameters,如何编写一个方法来接受任何类型的数组(包括原语)作为参数 例如,我希望以下两个调用都能正常工作: int[] intArray = {1, 2, 3}; String[] strArray = {"1", "2"}; hasSize(intArray, 3); hasSize(strArray, 2); 到目前为止,我得到的最接近的结果是: public static <T> boolean hasSize(T[] array, int expectedSize) { r

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

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

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);
}
publicstaticbooleanhassize(T[]数组,int-expectedSize)
{
返回值(array.length==expectedSize);
}

…但这对原语不起作用。

如果我没记错的话,您不能创建一个您希望具有take原语的泛型数组,因为原语本身不是类,Java泛型系统也不可用


相反,传入数组必须是整数[]、双精度[]等。

除了
对象之外,基本数组和对象数组不共享基类

因此,唯一的可能是接受一个对象并在方法内部检查它是否是数组

public static <T> boolean hasSize(Object x, int expectedSize)
{
    return (x != null) && x.getClass().isArray() ?
        java.lang.reflect.Array.getLength(x) == expectedSize :
        false;
}
publicstaticbooleanhassize(对象x,int-expectedSize)
{
返回(x!=null)&&x.getClass().isArray()?
java.lang.reflect.Array.getLength(x)=expectedSize:
虚假的;
}
当然,这也接受非数组,可能不是您想要的解决方案


因此,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);
    }
}
公共A类{
公共静态void main(字符串[]args){
int[]intArray={1,2,3};
字符串[]strArray={“1”,“2”};
hasSize(Arrays.asList(intArray),3);
hasSize(Arrays.asList(strArray),2);
}
公共静态布尔值大小(列表数组,int expectedSize)
{
返回值(array.size()==expectedSize);
}
}
这不是你想要的。但是您可以通过将数组传递给list来利用通用机制,而自动装箱可以为您完成这项工作


如果这种方法对您有好处,那么可以,但如果不是一种好方法,不幸的是,通用机制不支持基元类型,因此您必须覆盖每个数组类型的方法。

如上所述,您不能混合基元数组和对象数组,您必须使用包装类。 如果函数要除变量参数外,那么一种写入方法就是使用vargs概念

public static <T> void process(T...args) {
    System.out.println(Arrays.toString(args));
}
公共静态无效流程(T…args){
System.out.println(Arrays.toString(args));
}

这个概念在java内部API中使用了

使其成为一个对象数组?我也这么想,但是Object[]不接受原语..可能是重复的否,它不是重复的。这个问题显然适用于多种不同的类型,包括原语。不,这是无用的。它强制用户调用{{Arrays.asList()}},如果用户调用{{Arrays.asList().size()}},也可以调用{{Arrays.asList().size()}}}并在不编写方法的情况下直接使用int==int比较。这很公平。我必须编写一整套基本数组方法,使之完全支持任何数组。这是一个遗憾,因为除了一个参数类型之外,每个方法的实现都是相同的。更正:“必须是整数[],双精度[],等等。”应该是“int[],双精度[],等等”。包装的整数、双精度类型将与对象[]匹配,该问题仅存在于未包装的基元类型。