Метод getClass Java с типами массивов - PullRequest
17 голосов
/ 29 июля 2011

Итак, я столкнулся с чем-то странным, и я не знаю, как это называется, поэтому у меня возникают проблемы с поиском информации об этом, поэтому мой вопрос здесь.

Я столкнулся с проблемой, когда, если вы создадите массив любого типа и вызовете getClass для этого массива в Java, вы получите странный возврат. Мне интересно, почему вы получаете это конкретное возвращение и что это значит.

Пример кода следующий:

byte[] me = new byte[1];
int[] me2 = new int[1];
double[] me3 = new double[1];
float[] me4 = new float[1];
String[] me5 = new String[1];
Integer[] me6 = new Integer[1];

System.out.println(me.getClass());                  
System.out.println(me2.getClass());                 
System.out.println(me3.getClass());                 
System.out.println(me4.getClass());                 
System.out.println(me5.getClass());
System.out.println(me6.getClass());

и вывод:

 class [B
 class [I
 class [D
 class [F
 class [Ljava.lang.String;
 class [Ljava.lang.Integer;

Ответы [ 5 ]

22 голосов
/ 29 июля 2011

Метод toString класса вызывает метод getName класса, который

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

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

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

 Element Type           Encoding
 boolean                Z
 byte                   B
 char                   C
 class or interface     L<i>classname</i>;
 double                 D
 float                  F
 int                    I
 long                   J
 short                  S 

Имя класса или интерфейса Имя класса - это двоичное имя класса указано выше.

Примеры:

 String.class.getName()
     returns "java.lang.String"
 byte.class.getName()
     returns "byte"
 (new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
 (new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"
5 голосов
/ 29 июля 2011

Это просто какое-то глупое соглашение об именах.Было бы намного лучше, если бы они были более читабельными: class byte[], class java.lang.Integert[][]

1 голос
/ 29 июля 2011

[ в начале имени класса должно читаться как "массив ...", где "..." означает то, что следует за [;условные обозначения, изложенные ниже, изложены в документации для Class.getName(), на которую @emory ссылается и на которую ссылается.

Раздел 4.3.1 спецификации языка Java начинается: «Объект являетсяэкземпляр класса или массив. "Это говорит о том, что массивы не являются экземплярами классов.(Возможно, именно это @TigerTrussell получил в своем ответе.) Однако начинается Раздел 10.8 : «Каждый массив имеет связанный объект Class, совместно используемый со всеми другими массивами с таким же типом компонента. Прямой суперкласстипа массива является Object. "Это говорит о том, что массивы, если не истинные экземпляры классов, чертовски близки.

К сожалению, правила синтаксиса для Java запрещают наследование от типа массива:

public class MyFancyArray extends int[] { // ILLEGAL
   // ...
}

Обратите внимание, что этоограничение синтаксиса;нет никаких концептуальных или семантических барьеров (и это допускается во многих других языках ОО).

0 голосов
/ 29 июля 2011

Это имена базового типа объекта. [ указывает, что это массив, а следующая буква указывает тип массива. B = байт, I = целое число, D = двойной и т. Д. "L" для членов типа класса, как вы можете видеть.

0 голосов
/ 29 июля 2011

Массивы не имеют классов, это просто структуры данных.Единственное, что имеет класс, это что-то расширенное из Object, включенного в массив.

...