JLS says soですので、許可されていません。構文は、宣言および配列作成式でのみ許可されます。次のように私の推測であり、new T[]
を必要とするため、実際の根本的な理由としては
int[] a;
a = new int[]{1, 2, 3, 4};
:
後者は、同じ結果を達成するための代替方法を提供します。以下の配列初期化子を考えてみましょう:
{1, 2, 3, 4}
異なるタイプの配列を初期化するために使用することができます。
new int[]{1, 2, 3, 4};
new float[]{1, 2, 3, 4};
new double[]{1, 2, 3, 4};
new T[]
ビットが必要とされなかった場合、私は裸{1, 2, 3, 4}
の中に問題を引き起こす可能性があると思われます意味分析。この構文が許可された場合、言語仕様を呼び出すために機能の選択の複雑さに対処しなければならない
void f(float[] x) { ... }
void f(double[] x) { ... }
void g() {
f({1, 2, 3, 4});
}
:ここでは、私のような例を考えています。
同様に、{null}
の種類を明確にすることはできません。 Object[]
,Integer[]
,Serializable[]
などとすることができます。
最後に、空の配列{}
が最も難しいでしょう。ここでは、オブジェクトの配列かスカラーの配列かどうかはわかりません。
これらの複雑さをすべて処理する代わりに、言語設計者はnew T[]
の構文を要求することによってそれらを回避することを選択したようです。
出典
2012-05-09 16:57:41
NPE
これは重複していません。 OPは、なぜ*どうやって*どうやっていないのかを尋ねている。 – Jeremy
Meh;それは偽りのリンクの質問は、 "それは動作するように私はそれを行う"と言うことを確信していない、この質問は "どうして他の方法は実際に動作しない"と尋ねる。違いは完全に異なった答えにつながります。この質問には既に*どのように*働かせるかがあります。 –
これらの種類の質問は面白いですが、答えるのは非常に不可能です。私たちができるのは推測です。しかし、この仕様書の一部を書いた人には教訓の瞬間として(なぜこのデザインをしていないのですか?)、これを尋ねるのは本当に面白いでしょう。 – yshavit