2017-07-28 56 views
3

我問這是出於好奇不允許的,因爲我還沒有發現一個問題,這個具體的編譯錯誤,在計算器上:了傳統陣列的符號上的可變參數數量參數

Legacy array notation not allowed on variable-arity parameter

我遇到的傳統符號看到包含簽名像這樣的代碼時:

private void a(int ints[]){/*...*/}

所以我打了角落找尋一點,直到我下面的示例中遇到的編譯錯誤。

// this method compiles as expected 
private void method1(int[][] ints){ /*...*/ } 

// this too 
private void method2(int[]... ints){ /*...*/ } 

// this does to, but makes use of legacy array notation 
private void method3(int ints[][]){ /*...*/ } 

// this still does, even when mixing up the notations 
private void method4(int[] ints[]){ /*...*/ } 

// this however fails to compile 
private void method5(int... ints[]){ /*...*/ } 

是否有一個特定的原因,即語言設計者決定如何實現它?不允許使用遺留數組表示法的可變參數?

NOTE: I understand the legacy notation

回答

2

我不知道爲什麼他們決定這樣做*,但是,我只是想確認這是規範的正式組成部分,是完全可以預期產生編譯時錯誤:

It is a compile-time error to use mixed array notation (§10.2) for a variable arity parameter.

JLS 8.4.1

*這個問題是意見爲基礎的,因爲除了Java語言的設計者沒有人能告訴你。如果我想推測,這可能是因爲首先允許多個符號是一種壞主意。

+1

檢查它謝謝你,這是我正在尋找的答案:) – Lino

+1

和我同意多個符號*是一個壞主意 – Lino

+1

@Lino這是主要這些天Java的問題。太多的行李以保持向後兼容性。像Kotlin似乎是未來! – Michael

3

int[] aint a[]是相同的東西,

所以1,3和4是等價的。

2,你基本上是說:「我想int []類型的可變參數」

因此它可以被稱爲像method2(new int[]{},new int[]{})

5,int..告訴編譯器它是一個可變參數類型int,參數名稱取爲ints[],這是無效的變量名稱。

+0

聽起來很合理,你有任何確認這是正確的嗎? – Lino

+0

好吧,似乎沒有任何其他原因。我的意思是如果你拿出最後一個方法參數名稱中的'[]',它就起作用了。 – Ramanlfc

+0

對於第二種方法,你說你可以讀取簽名爲「*我想要一個可變長度類型int [] *」,所以你不能說第五種方法相同嗎? 「*我想要一個ints [] *」的可變參數(ints []中的s是有意的) – Lino

相關問題