2009-11-01 126 views
43

考虑方法声明:可变参数和“...”参数

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

黑体序列是真正的问题。
这是第二个问题:...数组/参数是否有名字?

+1

对不起,我不得不在测试之前测试它......我想我很久以前就遇到了这个问题。 – 2009-11-01 11:32:43

回答

52

docs on varargs

最终 参数的类型后三个时期表明 最后一个参数可以作为 传递数组或一系列参数。

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

下面的作品就好了:

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 
    } 
} 
+1

所以,如果你想用一个参数调用该方法,它恰好是一个数组,你必须明确地将其包装在另一个中。 '方法(new Object [] {array});' – 2010-10-07 20:38:07

+8

或者做'方法((Object)数组)',它会自动换行 – naiad 2011-05-21 00:18:35

+0

我比以前更好看了这些关于可变参数的解释,但我仍然只是不明白。 – Sizons 2015-06-06 07:02:43

11

你可以只传递一个数组:

public void foo(String... args) { 
} 

String args[] = new String[10]; 
foo(args); 
+0

我甚至不打算添加我自己的答案,在“...被称为可变参数或可变参数并且需要指定元素的0..n个元素”或类似的东西中进行编辑。 – Esko 2009-11-01 11:19:06

8

你所描述的将是相当罕见的情况:大多数时候,你的可变参数项目将String S,或数字,或Widget秒。 。对于他们而言,这将是不寻常的,它可能是任何东西或数组。

但如果可变参数的参数一堆Object S或数组类型,那么你的问题提出来了:你可以通过一个单一数组,然后将如何编译器知道你是否打算通过一个数组(你提供的那个),还是一系列它应该放入你的数组中的一个项目?

快速测试显示了答案:

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 = [email protected] 
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 

所以答案是,在模棱两可的情况下,把你作为传递而不是创建一个新的数组来包装它,这是有道理的,因为如果你想要其他的解释,你可以自己把它包装在一个数组中。