2012-10-09 38 views
4
package arraypkg; 

import java.util.Arrays; 

public class Main 
{ 
    private static void foo(Object o[]) 
    { 
     System.out.printf("%s", Arrays.toString(o)); 
    } 

    public static void main(String[] args) 
    { 
     Object []o=new Object[]{1,2,3,4,5}; 
     foo(o);      //Passing an array of objects to the foo() method. 

     foo(new Object[]{6,7,8,9}); //This is valid as obvious. 

     Object[] o1 = {1, 2};  //This is also fine. 
     foo(o1); 

     foo({1,2});    //This looks something similar to the preceding one. This is however wrong and doesn't compile - not a statement. 
    } 
} 

在前面的代碼片斷除了最後一個的所有表達式被編譯和運行良好。儘管最後一條語句看起來與其直接語句相似,但編譯器會發出編譯時錯誤 - 表達式的非法開始 - 而不是語句。爲什麼?直接傳遞數組初始化的方法參數不起作用

+0

這是語言的缺點。希望他們有一天能解決這個問題 – irreputable

回答

8
foo({1,2}); 

{1,2}這種陣列初始化只在你聲明數組..在其他地方的地方工作,你必須使用new關鍵字來創建它..

這就是爲什麼: -

Object[] obj = {1, 2}; 

很好.. 這是因爲,陣列的類型,被我們用在LHS的reference類型暗示。但是,當我們用它在其他地方,編譯器無法找出類型(就像你的情況)..

嘗試使用: -

foo(new Object[]{1,2}); 
+0

我認爲OP對解釋更感興趣,特別是因爲Object [] o1 = {1,2};'工作。 – Dave

+0

@Dave ..我給瞭解釋.. –

+1

我已經看過[JLS](http://docs.oracle.com/javase/specs/jls/se5.0/html/arrays.html#10.6) - 「*數組初始值設定項可以在聲明中指定,或作爲數組創建表達式的一部分指定[(§15.10)](http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions .html#46168),創建一個數組並提供一些初始值*「但沒有找到更多細節。謝謝! – Tiny

3

foo({1,2});不知道是什麼類型的數組。所以,編譯器無法理解語法。所有其他聲明指定數組的類型。

+0

@PratyushVerma:是的,這是正確的。但是,正如Tiny評論Rohit的答案,該語法僅作爲數組創建表達式的一部分有效。除此之外,jvm無法理解它是什麼。 – kosa

1

foo({1,2});不是數組。

並且由於您的foo()方法採用陣列類型參數,因此失敗。