Я должен знать, какие многомерные массивы класса в Java расширяет точно?
Когда мы присваиваемся
Object[] ref=new int[]{1,2,3};
компилятор жалуется, что объекты имеют различные типы. Таким образом, кажется, что одномерные массивы расширяются Object
; Я уже знаю это.
Но когда мы присваиваемся
Object[] ref2=new int[][]{{1,2,3},{4,5,6}};
компилятор не будет жаловаться. Таким образом, кажется, что двумерные матрицы расширяются Object[]
.
Но когда я печатаю его суперимя класса:
System.out.println(ref2.getClass().getSuperclass().getName());
Я добрался java.lang.Object
.
Таким образом, кто-либо может объяснить, что продолжается здесь?
Многомерный массив в Java на самом деле просто массив массивов (массивов) *.
Кроме того, массивы считаются подклассами Object.
Итак, ваш int [] []
- это объект []
(с типом компонента int []
), а также объект
(потому что все массивы являются объектами)
An int []
, однако, не является Object []
(но он все еще является Object
) .
Кажется, что двумерные массивы расширяют Object []
Я не уверен, что «расширять» здесь правильное слово. Массивы занимают особое место в системе типов Java и работают несколько иначе, чем другие объекты. Двумерный массив определенно является Object []. Но если вы спрашиваете о суперклассах, единственный суперкласс, который есть у любого типа массива, - это Object. Все массивы также можно клонировать и сериализовать.
Ваше дерево наследования выглядит примерно так:
int[][][]
Object[]
Object
Вот фрагмент кода, иллюстрирующий то, что я имею в виду:
Object ref2 = new int[][]{{1,2,3}, {4,5,6}};
System.err.println("ref2: " + (ref2 instanceof int[][]) +
" " + (ref2 instanceof Object[]));
Вы должны увидеть что-то вроде:
ref2: true true
Массивы в Java ковариантны. Это означает, что TSub[]
является подтипом TSuper[]
, если TSub
является подтипом TSuper
.
У вас есть int[][][]
, который является массивом int[]
. Теперь, как отмечали другие, любой массив в Java является подтипом Object
, поэтому int[]
является подтипом Object
. Итак, в силу ковариации массивов, int[][]
является подтипом Object[]
(подставьте TSub = int[]
и TSuper = Object
в приведенное выше определение ковариации).
Edit - Чтобы было понятно, почему здесь важна ковариантность, подумайте, что сделать то же самое с List
не получится:
List<Object> ref2 = new List<int[]>()