Инициализация массивов

1,00
р.
Почему такая инициализация массива допустима:
int[] array = {1,2,3}
а вот такая нет:
int[] array array = {1,2,3}
Вроде бы можно сказать, что способы вполне эквиваленты.

Ответ
Так определено в языке.
Синтаксис int[] array = {1,2,3} — это инициализация, целостное выражение, которое не есть «присваивание array значения {1, 2, 3}», а «инициализация массива значениями 1, 2, 3».
А array = {1, 2, 3} — это присваивание. Но правая часть тут вовсе не определена в языке, инициализатор не имеет самостоятельного смысла.
Вы можете, однако, присвоить так:
int[] array array = new int[] {1, 2, 3}
Здесь правая часть new int[] {1, 2, 3} — нормальный, инициализированный объект.

В принципе, язык мог бы определить {1, 2, 3} как литерал массива, то есть, чтобы это имело такое же значение, как new int[] {1, 2, 3}. Но дизайнеры языка посчитали это излишним.
Мне кажется, они руководствовались таким соображением: для литералов целых чисел (типа 5) нет особой разницы, писать ли
int x = 5 int y = 5
или
int x = 5 int y = x
А вот для литералов массива (который есть ссылочный тип) разница была бы: вот такой гипотетический код
int[] x = {1, 2, 3} int[] y = {1, 2, 3} x[0] = 10 System.out.println(y[0])
и
int[] x = {1, 2, 3} int[] y = x x[0] = 10 System.out.println(y[0])
вели бы себя по-разному! И это приводило бы к ошибкам и недопониманию. Но это лишь мои догадки.