在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[],双精度[],等等”。包装的整数、双精度类型将与对象[]匹配,该问题仅存在于未包装的基元类型。