Javaの配列の初期化の謎

Javaの配列は↓のように初期化することができる。

int[] a={11, 2, 7, 3, 5};

このことはJava言語規定 - 10.6 配列初期化子にも書かれている(英語原文はこちら)。


でも、実は次のような書き方をすることもできる。

int[] a=new int[]{11, 2, 7, 3, 5};

{}だけで初期化できるのだから、わざわざnew int[]を書く必要はないじゃん、と思うかもしれない。しかし、次のように書いたときには事情が変わってくる。

int[] a;
a={11, 2, 7, 3, 5};

↑はコンパイルエラーになってしまうのだ。エラーメッセージは"Array constants can only be used in initializers"。でも、↓の書き方ならコンパイルできる。

int[] a;
a=new int[]{11, 2, 7, 3, 5};

今までずっと後者の書き方で配列を初期化していた。どこでその書き方を知ったのかもはや記憶にない。

少し前に、たまたま前者の書き方を知って驚き調べてみたところ、後者の書き方を説明しているようなサイトは(探した限りでは)見つからない。言語規定ですら触れられていない。なら、一体この書き方は何なんだ?


配列初期化子{}だけではその配列の型があやふやだし({1, 2, 3}はbyte[]かshort[]かint[]かlong[]かわからない)、new int[]{}のように書いた方がいいんじゃないかと思うけど、この書き方が正式なものなのかもよくわからない。他にこの書き方をしている人はいるのかな?


そもそも、この書き方をWEBで発見できないのに、WEBでしかJavaを勉強していない私はどうやってこの書き方を知ったのだろう?謎は深まるばかりだ・・・。