В Java, когда сокращение массива {a, b, c,...} неуместно и почему?

Если вы определяете переменную, она выглядит совершенно корректной для объявления/определения переменной следующим образом:

    double[][] output = {{0,0},{1,0}};

Но если вы возвращаете значение, это выглядит недействительным, чтобы написать следующее:

    public double[] foo(){
      return {0,1,2}
    }

Я бы подумал, что внутренне, оба они выполняли бы одно и то же действие. Затмение, по крайней мере, не соглашается. Кто-нибудь знает, в чем разница, и где еще это можно увидеть, или почему было бы полезно принять прежний пример и отвергнуть последнее?

Изменить: хорошо, поэтому это необходимо, когда вы инициализируетесь, но я не вижу никакой двусмысленности... не удалось JVM интерпретировать тип переменной от имени переменной (в случае переопределения уже инициализированные переменные) или при возврате (где JVM может просто посмотреть на возвращаемый тип функции)? Что делает инициализацию частным случаем правила, которое запрещало бы неявный тип? Что заставляет общее правило требовать явный тип?

Ответ 1

Это приемлемо только во время декларации. Однако вы можете использовать new double[] {0, 1, 2}.

JLS §10.6:

Инициализатор массива может быть указан в объявлении или как часть выражение для создания массива.

Выражение создания массива - это синтаксис new double[] { }.

Ответ 2

Вы можете использовать нотацию привязки только в точке объявления, где компилятор может вывести тип массива из типа объявления.

Чтобы использовать его в другом месте, вам нужно использовать Expression Creation Expression:

return new double[] {0,1,2};

Ответ 3

Еще один крайний случай, который я обнаружил, заключался в создании двумерного массива и инициализации массивов в двумерном массиве

Поэтому из ответа Джеффри - https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 - "Инициализатор массива может быть указан в объявлении или как часть выражения создания массива", приведенный ниже код должен работать, потому что инициализатор массива используется для инициализации массива

int[][] grid = new int[3][3];
grid[0] =  {1,1,1};

Однако это не сработало (ошибка компиляции), и мне пришлось переписать это как

grid[0] =  new int[]{1,1,1};