Массивы в 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
.
Помните, что массив является 'Object' в Java. –
Массивы, в данном случае массивы String, также считаются объектами. Попробуйте Object obj = new String [] и посмотрите, как это происходит. –