2016-03-01 43 views
2

在分配類型T數組期間,表達式的new T[]部分是隱含的。爲什麼只能在賦值期間創建沒有`new`的數組?

int[] test = {1,2,3,5}; 

語言規範說明爲什麼這種類型的初始化不被其他地方支持嗎?像下面這樣的語法會與其他語言規則衝突嗎?似乎類型推斷不會太困難。

public static void test(int[] a, int[] b) { ... }; 
... 
test({1,2,3}, {4,5,6}); 
+0

聽起來像一個語言設計師的問題 – Kon

+1

因爲* syntly糖*將你的例子變成了int [] test = new int [] {1,2,3,5};' –

+0

這是支持的java.lang.String中。我相信這主要與對象的複雜性有關。對於像數組這樣的簡單對象,編譯器具有固定的表示形式。對於其他自定義類型,編譯器無法知道如何對對象進行編組和解組。 – Prashant

回答

2

的JLS不說,你不能做到這一點在第15條在15.12 Method Invocation Expressions開始,我們可以看到所有你可以調用一個方法的有效途徑。其中重要的部分是可選的ArgumentList,它會給出關於參數有效語法的規範。

就在調用表達式下方,我們可以看到ArgumentList的定義,它主要是另一個鏈接Expression

當我們看到後,我們可以看到在Expression中定義了兩種類型的表達式; LambdaExpressionAssignmentExpression。據我可以告訴你的問題是"Class instance creation expressions"類型。這是由諸如foo(new Bar[]{new Bar(), new Bar()});之類的調用有效的事實證明的。

當我們點擊第15.9節的鏈接時,我們可以看到您提出的只是簡單的不支持。

這並不回答爲什麼;我意識到這一點。但是,只有做出該決定的人員才能回答原因。我們知道這種狡猾是可能由其他語言證明。

+0

還是有點困惑,這是很多新的信息!那麼,什麼定義會使內聯賦值與常規賦值不同?即)是什麼使這樣的事情不可能'String [] a; System.out.println((a = {}));'? – flakes

+1

@ flkes,我相信這是一樣的原因。你正在創建一個類的實例,所以它仍然必須符合我提到的定義。賦值運算符可以像使用數組的簡單賦值一樣使用,但這不是新對象的實例化。因此,給定數組''''和't',這是有效的:'foo(s = t);'只是將't'分配給's',然後將結果傳遞給'foo'。不是一回事。 – ChiefTwoPencils

相關問題