2012-06-19 238 views
3

我用Java 7中,我創建一個可變參數方法爲什麼鑄造(對象)空結果不爲空?

public class JavaApplicationTest { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     addBundleMessage("b", Integer.SIZE, "key", (Object) null); 
    } 

    public static void addBundleMessage(String bundleName, Integer severity, String key, Object... params) { 
     if (params == null) 
      System.out.println("params Is null"); 
     else 
      System.out.println("Params not null"); 
    } 
} 

如果我不投的對象,在Netbeans的集成開發環境Eclipse或抱怨,但它編譯:

的非可變參數調用varags法不精確的參數類型爲去年 參數

沒有投:它顯示PARAM s爲null

當我投null以(對象)它顯示PARAMS不是null

當我投null以(對象[])它顯示params爲null

這是正常行爲嗎?

回答

6

是的,這是「正常」的行爲。

混淆來自可變參數後來被鎖定在語言上,並且正在使用數組作爲「實參」來實現可變數量的參數。

public static void addBundleMessage(String bundleName, Integer severity, 
    String key, Object... params) { 

是幾乎相同

public static void addBundleMessage(String bundleName, Integer severity, 
    String key, Object[] params) { 

和罩下,將PARAMS傳遞包裹作爲Object []。

但是,您仍然可以選擇自己傳入該陣列。

如果使用(Object[]) null,則會得到一個參數(即null)。

如果您使用(Object) null,它使用varargs方法,因此它傳遞一個數組來保存參數(其中只有一個參數爲null)。

對於可變參數法的「正常使用」,params永遠不會爲空。你可以得到的「最差」是一個空數組(如果根本沒有參數的話)。

0

該轉換不會對null做任何事情,它只會幫助編譯器在重載的方法之間進行選擇。 由於您使用的是多參數方法,參數將是一個數組,因此您的空測試不相關。

0

當沒有投:它顯示params爲null

的可變參數爲空在這種情況下,讓你獲得一個空

當我投零至(對象),它顯示PARAMS NOT NULL

的可變參數包含一個對象(根據你的鑄造),這是空

當我投零到(對象[])的顯示params爲null

的可變參數 []你傳遞的對象,這是空

0

沒有中投的與演員陣容一樣Object[]。您正在傳遞一個空參數數組,因此params爲null。

當您將null轉換爲Object時,您傳遞的是單個null參數,因此params不爲空,而是Object[1],它的唯一元素爲null。