2016-04-22 57 views
-2

我轉換的Groovy代碼庫到Java和忘記改變的Java 8的主要功能簽名可變參數

public static void main(String... args) { 

public static void main(String args[]) { 

並編譯這段時間跑項目只很驚訝只有現在這是合法的Java 8代碼。

據我所知,Java 8 Varargs使函數具有任意數量的參數,「根據它們在方法調用上的位置將它們壓縮成一個數組」。

但隨着String... argsString[] args方式函數調用語法上是不同的:

void function1 (String[] args) {} 
function1({"one", "two", "three"}); 

void function2 (String... args) {} 
function2("one", "two", "three"); 

因此,如何爲String... args法律爲String args[]從終端攫取PARAMS什麼時候?


編輯:

azurefrog鏈接的回答不同的問題是巨大的。我想提一提另一個答案在評論提供我一直在尋找的答案:

Why doesn't Java's main use a variable length argument list?

註釋1:有趣。根據其他答案/評論判斷,我猜這個新的主要聲明語法是在Java 1.5中添加的。因此,Java運行時根據主要方法聲明確定是將字符串直接傳遞給main還是先構建一個數組?

評論2:不,它總是建立一個數組。就被調用的方法而言,參數爲String... args == String[]。在任何情況下,參數都是數組

這就是我的問題。對不起,如果它被問及不好。

+2

基本上是因爲JLS這麼說的。看[這個答案](http://stackoverflow.com/a/2201895/1361506)。 – azurefrog

+0

varargs在Java中自1.5起有效,我想。可能的重複http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – Wizard

+0

@嚮導不是重複的。我並不是問一個語法與其他語言相比有什麼好處。當我使用任何語法時,我都會詢問使用相同結果運行Java代碼的底層實現。 – sargas

回答

3

我相信這是合法的,因爲可變參數被添加到語言中。顯式調用它們的語法當然不同,但命令行參數不是由其他Java代碼傳遞,而是「神奇地」傳遞。

JLS 12.1.4指定此:

的方法主要必須聲明爲public,static和無效的。它必須指定一個形式參數(§8.4.1),其聲明類型是String數組。因此,無論下面的聲明是可以接受的:

public static void main(String[] args) 

public static void main(String... args) 
+0

我的印象是'javaCode arg1 arg2'會將參數變成一個數組。因此我認爲另一種定義main的方法是使用param'String [] ... args',因此它可以接受任意數量的'String []'。但是我開始理解運行Java代碼(編譯後)和調用Java代碼(來自其他代碼)之間的基本區別。 – sargas

+0

你認爲第二個維度來自哪裏? 'String [] ...'與'String [] []'具有相同的類型。 –

+0

那是我的想法。你的回答爲我提供了足夠的光線,可以找出我思考中的缺陷。現在它是有道理的。 – sargas