Что это такое: [Ljava.lang.Object ;?

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

Как называется этот тип кодирования?

Ответ 1

[Ljava.lang.Object; - это имя для Object[].class, java.lang.Class представляет класс массива Object.

Схема именования описана в Class.getName():

Если этот объект класса представляет ссылочный тип, который не является типом массива, то возвращается двоичное имя класса, как указано в Спецификации языка Java (§13.1).

Если этот объект класса представляет тип примитива или void, то возвращаемое имя является ключевым словом языка Java, соответствующим типу примитива или void.

Если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько символов '[', представляющих глубину вложения массива. Кодировка имен типов элементов выглядит следующим образом:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

Ваш последний в этом списке. Вот несколько примеров:

// xxxxx varies
System.out.println(new int[0][0][7]); // [[[[email protected]
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [[email protected]

Причина, по которой метод toString() для массивов возвращает String в этом формате, заключается в том, что массивы не @Override метод, унаследованный от Object, который указан следующим образом:

Метод toString для класса Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символ знака "@" и шестнадцатеричное представление без знака для хеш-код объекта. Другими словами, этот метод возвращает строку, равную значению:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Примечание: вы не можете полагаться на toString() любого произвольного объекта, чтобы следовать приведенной выше спецификации, поскольку они могут (и обычно делают) @Override возвращать что-то еще. Более надежный способ проверки типа произвольного объекта состоит в том, чтобы вызвать getClass() для него (метод final, унаследованный от Object), а затем отразить в возвращаемом Class объект. В идеале, однако, API должен быть спроектирован таким образом, чтобы отражение не было необходимым (см. Effective Java 2nd Edition, Item 53: Предпочтение интерфейсов для отражения).


О более "полезном" toString для массивов

java.util.Arrays предоставляет перегрузки toString для примитивных массивов и Object[]. Существует также deepToString, который вы можете использовать для вложенных массивов.

Вот несколько примеров:

int[] nums = { 1, 2, 3 };

System.out.println(nums);
// [[email protected]

System.out.println(Arrays.toString(nums));
// [1, 2, 3]

int[][] table = {
        { 1, },
        { 2, 3, },
        { 4, 5, 6, },
};

System.out.println(Arrays.toString(table));
// [[[email protected], [[email protected], [[email protected]]

System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]

Есть также Arrays.equals и Arrays.deepEquals, которые выполняют сравнение равенства массивов по своим элементам, среди многих других утилитных методов, связанных с массивами.

Смежные вопросы