2014-01-03 8 views
9

Почему этот код компилируется?Почему "Object [] object = new String [] []" компилируется? - Java

Object[] object = new String[5][5]; 

Я имею в виду, почему я могу это сделать, если я создаю объект массива с различными размерами, чем указано в ссылочной переменной?

Это не компилируется:

String[] strings = new String[5][5]; 

Так что же здесь происходит?

+9

Помните, что массив является 'Object' в Java. –

+0

Массивы, в данном случае массивы String, также считаются объектами. Попробуйте Object obj = new String [] и посмотрите, как это происходит. –

ответ

3

Первый компилируется, потому что String[] является Object. Второй не компилируется, потому что String не String[].

Object[] object = new String[5][5]; // Means each element is an String[] which is an Object as well. 

String[] strings = new String[5][5]; // Also Means each element is an String[] which is not same as just String. 
+1

Это был ответ, который я искал – GabrielBB

1

Любой массив сам является Object.

Таким образом, по этому правилу:
String[5] является Object.
String[5][] является Object[].
String[5][] и String[5] - Object s тоже.

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

Для всех, кроме Object типов, это правило не применяется, а затем:
String[5][5]НЕ а String[]

4

Массивы в Java являются covariant. Для любых типов T1 и T2, если T2 происходит от T1 (то есть, T2 прямо или косвенно расширяет или реализует T1), то T2[] является подтипом T1[]. Таким образом, String[] является подтипом Object[], и вы можете присвоить объект типа String[] переменной типа Object[].

Примечание (как указывает Оли Чарлворт в комментарии), ковариация нарушает безопасность типа компиляции Java. Этот код:

Object [] o = new String[5]; 
o[0] = Integer.valueOf(3); 

будет генерировать ArrayStoreException во время выполнения, когда вторая линия пытается выполнить. Поэтому я не предполагаю, что ковариантные массивы - отличная вещь; именно так работает язык.

Что касается вашего второго примера, то String[] не является String[][]. Ковариация не применяется, поскольку String[] не является результатом String. Тем не менее, вы можете сделать:

Object[] o = new String[5][5]; 

потому String[], по сути, Object.

+0

Это нормально, пока вы не выполните 'String [] stringings = new String [5]; Object [] objs = строки; objs [0] = new Integer (42); '... –

+0

@OliCharlesworth - Спасибо за это. Я добавил что-то об этом к моему ответу. –

+0

+1 для того, чтобы быть единственным, кто сказал 'covariant' :) – nachokk

1

Массив строк (например, String [5]) можно рассматривать как объект. То же самое для двумерного массива (или массива массивов).Однако двумерный массив строк не является одномерным массивом строк, поэтому вы не можете назначить 1-мерный массив строк для 2-мерного массива строк.

Также обратите внимание, что в Java (и не только) двумерный массив представляет собой в основном массив массивов. Поэтому в примере, который вы указали, вы можете назначить двумерный массив (массив массивов) строк для массива объектов (поэтому в каждом индексе массива объектов вы храните одномерный массив строк), но вы не может сделать это со строками.

0

1- для первого кода вы не можете быть в состоянии использовать строковые методы, как

object[0][0].substring(1);//error 
//correct to use string methods 
strings[0][0].substring(1); 
strings[0][0].chartAt(0); 

но второй код, который вы можете использовать строковые методы.

2- второй код должен быть:

String[][] strings = new String[5][5]; 
Смежные вопросы