您所描述的情况将相当罕见:大多数情况下,您的可变参数项目将是String
s、或数字或Widget
s……它们是Object
s(可能是任何东西)或数组是不寻常的。
但是,如果 varargs 参数是一堆Object
s 或数组类型,那么确实会出现您的问题:您可以将单个数组传递给它,然后编译器将如何知道您是否打算传递一个数组(您提供的那个),或者应该为您放入数组的一系列 1 项?
快速测试显示了答案:
public class TestClass {
public static void main(String[] args) {
Object anObject = new Object();
Object[] anArray = new Object[] {anObject, anObject};
System.out.println("object1 = " + anObject);
System.out.println("array1 = " + anArray);
takesArgs();
takesArgs(anObject, anObject);
takesArgs(anArray); // is this the same as array1?
takesArgs(anArray, anArray);
}
public static void takesArgs(Object... stuff) {
System.out.println("The array was " + stuff);
}
}
执行的结果(您的确切数字会有所不同:
object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1
所以答案是,在模棱两可的情况下,它会将您传递的内容视为数组,而不是创建一个新数组来包装它。这是有道理的,因为如果您想要其他解释,您总是可以自己将它包装在一个数组中。