Подтвердить что ты не робот

Java: Почему я не могу объявить массив как простой объект?

В Java я могу скомпилировать

Object[] obj = {new Object[1], new Object[2]};

Но я не могу скомпилировать

Object obj = {new Object(), new Object()};

В первом примере я объявляю one-dimensional array of Objects и присваиваю ему two-dimensional array. Во втором я объявляю Object и присваиваю ему одномерный массив.

Если массив Java расширяет Object, почему второй фрагмент кода не компилируется? Почему первый?

4b9b3361

Ответ 1

Назначение массива для объекта не является проблемой, но вы должны создать такой массив, как этот

Object obj = new Object[] { new Object(), new Object[2] };

В противном случае компилятор не будет знать, что это массив Object, а не какой-либо другой массив.

Ответ 2

Потому что Array является не просто подклассом Object. Массивы также имеют семантику и синтаксис языкового уровня.

Отдельно, ваш второй пример задает вопрос: где бы объект сохранил эти две вещи, которые вы пытаетесь инициализировать? Вы только что объявили объект, но он не имеет именованных полей и не имеет массивов с числовыми индексами.

Первый пример компилируется, потому что вы объявили массив Object (то есть ссылки на объекты), а элементы, которые вы даете ему для инициализации этого массива, - это ссылки на объекты (ссылки на одноэлемент массивы, создаваемые с помощью new Object[1]).

Это также может помочь: в Java нет двумерных массивов, хотя есть некоторый удобный синтаксис, который делает его похожим на него. Он имеет (одномерные) массивы (одномерных) массивов (из... вы получаете идею).

Ответ 3

Проблема заключается в том, что при создании массива с использованием инициализатора компилятор должен обеспечить, чтобы все элементы из инициализатора имели один и тот же предоставленный тип, проверяя тип элемента по предоставленному типу.

Тем не менее, вам всегда нужно предоставить информацию о типе при инициализации массива. В противном случае компилятор не знает, как проверить правильность инициализации массива, тем самым давая illegal initializer error.

Нет проблем с назначением массива объекту. Например, вы можете сделать следующее:

int[] arr = {1,2};
Object obj = arr;

Следующий код не будет компилироваться:

Object obj = {1,2};

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

Скомпилируется следующий код:

Object[] obj = {1,2};

Поскольку был предоставлен тип элемента (т.е. Object), а компилятор будет проверять тип 1, 2 на тип Object (который преуспевает, так как Integer является подтипом Object).

Ответ 4

Вы не можете скомпилировать

Object obj = {new Object(), new Object()};

потому что obj не является массивом, поэтому объявляйте это как

Object[] obj = {new Object(), new Object()};

или

Object obj = new Object[] { new Object(), new Object() };

Отредактировано после следующей беседы