2009-11-01 131 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 

所以答案是,在模棱兩可的情況下,把你作爲傳遞而不是創建一個新的數組來包裝它,這是有道理的,因爲如果你想要其他的解釋,你可以自己把它包裝在一個數組中。