可变参数和“…”的论点

考虑方法声明:

String.format(String, Object ...) 

Object ...参数只是一个Object数组的引用。 有没有办法使用这个方法引用一个实际的Object数组? 如果我将一个Object数组传递给...参数 – 将得到的参数值是一个二维数组 – 因为Object[]本身就是一个Object

 Object[] params = ....; // Make the array (for example based on user-input) String s = String.format("%S has %.2f euros", params); 

因此,数组的第一个组件(在String.format方法中使用)将是一个数组,他将生成:

 [class.getName() + "@" + Integer.toHexString(hashCode())] 

然后由于数组大小为1而出现错误。

我希望我解释得很好。 可能很多语法错误(14岁和荷兰语),所以原谅我。

大胆的顺序是真正的问题。
这是第二个问题: 数组/参数是否有名字?

从可变参数文档 :

最后一个参数types之后的三个周期表示最后一个参数可以作为一个数组或一系列parameter passing。

所以你可以传递多个参数或数组。

以下工作很好:

 class VarargTest { public static void main(String[] args) { Object[] params = {"x", 1.2345f}; String s = String.format("%s is %.2f", params); System.out.println(s); // Output is: x is 1.23 } } 

你可以传递一个数组:

 public void foo(String... args) { } String args[] = new String[10]; foo(args); 

你所描述的情况将是相当罕见的:在大多数情况下,你的可变参数项将是String ,数字或者Widget …对于他们来说,这将是不常见的(可能是任何东西)或数组。

但是,如果可变参数一堆Object或一个数组types,那么你的问题就出现了:你可以把它传递给一个单一的数组,然后编译器怎么知道你是否打算传递一个数组(你提供的)或一系列的1个项目,它应该把你的数组放入一个数组?

快速testing显示答案:

 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 

所以答案是,在不明确的情况下,它把你传递给数组的东西当作数组来处理,而不是创build一个新的数组来包装它。 这是有道理的,因为如果你想要其他的解释,你总是可以把它自己包装在一个数组中。