Многомерные массивы в Java расширяются который класс?

Я должен знать, какие многомерные массивы класса в 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.

Таким образом, кто-либо может объяснить, что продолжается здесь?

7
задан Michael Myers 23 February 2010 в 16:18
поделиться

3 ответа

Многомерный массив в Java на самом деле просто массив массивов (массивов) *.

Кроме того, массивы считаются подклассами Object.

Итак, ваш int [] [] - это объект [] (с типом компонента int [] ), а также объект (потому что все массивы являются объектами)

An int [] , однако, не является Object [] (но он все еще является Object ) .

Кажется, что двумерные массивы расширяют Object []

Я не уверен, что «расширять» здесь правильное слово. Массивы занимают особое место в системе типов Java и работают несколько иначе, чем другие объекты. Двумерный массив определенно является Object []. Но если вы спрашиваете о суперклассах, единственный суперкласс, который есть у любого типа массива, - это Object. Все массивы также можно клонировать и сериализовать.

13
ответ дан 6 December 2019 в 10:00
поделиться

Ваше дерево наследования выглядит примерно так:

  1. ref2 is-a int[][][]
  2. ref2 is-a Object[]
  3. ref2 is-a Object

Вот фрагмент кода, иллюстрирующий то, что я имею в виду:

Object ref2 = new int[][]{{1,2,3}, {4,5,6}};
System.err.println("ref2: " + (ref2 instanceof int[][]) + 
  " " + (ref2 instanceof Object[]));

Вы должны увидеть что-то вроде:

ref2: true true
3
ответ дан 6 December 2019 в 10:00
поделиться

Массивы в 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[]>()
2
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: