可变参数和“…”的论点
考虑方法声明:
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一个新的数组来包装它。 这是有道理的,因为如果你想要其他的解释,你总是可以把它自己包装在一个数组中。