2013-07-17 39 views
48

我試過這個,並從JAVA得到奇怪的行爲,有人可以解釋這對我嗎?Java 3點參數(可變參數)行爲時,通過沒有參數或NULL

boolean testNull(String... string) { 
    if(string == null) { 
     return true; 
    } else { 
     System.out.println(string.getClass()); 
     return false; 
    } 
} 

boolean callTestNull(String s) { 
    return testNull(s); 
} 

然後,我有測試案例:

@Test 
    public void test_cases() { 
     assertTrue(instance.testNull(null)); // NULL 
     assertFalse(instance.testNull()); // NOT NULL 
     assertFalse(instance.callTestNull(null)); // NOT NULL 
    } 

的問題是,如果我叫testNull()直接與參數null,我會得到true回來,但如果調用callTestNull()null,這就要求testNull(),它告訴我參數不是null,而是空數組。

+0

如何找到該數組是空的? –

+0

也被稱爲省略號 –

+4

我的意思是用Java術語。但是,是的,字符「...」確實叫做省略號。有關編程的更多信息,請使用https://en.wikipedia。org/wiki/Ellipsis_(programming_operator) – eldris

回答

50

問題是如果我直接用參數null調用testNull(),我會返回true,但如果用null調用callTestNull(),它調用testNull(),它告訴我參數不爲null,但空陣列。

是的。如果使用編譯時類型String參數調用它,編譯器知道不能String[],所以它將它包裝在一個字符串數組中。所以這樣的:

String x = null; 
testNull(x); 

等同於:

String x = null; 
testNull(new String[] { x }); 

在這點上,(誤導命名)string參數將有一個非空值 - 相反,它會參考數組大小1的唯一元素是空引用。

但是,直接在方法調用中使用null文字時,可直接轉換爲String[],因此不執行換行。

JLS section 15.12.4.2

如果被調用的方法是一個可變參數數量方法米,它必須具有n> 0形式參數。 m的最終形式參數對於某些T必須具有類型T [],並且必須用k≥0實際參數表達式調用m。

如果使用k≠n實際參數表達式調用m,或者如果使用k = n實際參數表達式調用m並且第k個參數表達式的類型不與T []分配兼容, (e1,...,en-1,new | T [] |)來評估參數列表(e1,...,en-1,en,...,ek)。 {en,...,ek}),其中| T [] |表示T []的刪除(第4.6節)。

(重點煤礦。)

我強調的一點是,爲什麼包裝只有發生在參數的編譯時類型爲String,不是空類型。