Ява: что это: [Лява.ленг.Объект;?


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

1 90

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]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx

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

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

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

Примечание: вы не можете положиться на toString() любого произвольного объекта выполните описанные выше спецификации, так как они могут (и обычно делают) @Override это чтобы вернуть что-то еще. Более надежным способом проверки типа произвольного объекта является вызов getClass() на нем (a final метод, унаследованный от Object), а затем отражает на возвращенном