Что означает int.class

В java int, float и т.д., являются примитивными типами. Классы Wrapper используются, если мы должны использовать его с дженериками. Но все же в java работает следующее объявление,

 Class<Integer> intClass=int.class

Как мы можем называть int.class, хотя это примитивный тип?

Ответ 1

Примитив становится объектом

Для примитивов существуют объекты класса, доступные как константы с именем TYPE в соответствующих классах-оболочках - т.е. int.class изменен на java.lang.Integer.TYPE. Для других типов компилятор создает переменную частного члена в классе, скомпилированном для хранения объекта Class, и генерирует код для инициализации этого члена с помощью Class.forName().

Обнаружено обсуждение

И приятная обсуждение здесь, и ваш пример также рассмотрен в этой ссылке.

Несколько слов оттуда:

как класс может быть примитивным? Пусть путают вещи немного больше. Мы можем получить доступ к объекту Class, представляющему определенный класс, путем кодирования, например:

Equation.class // returns the Equation Class object

Но мы также можем сказать:

int.class

получить объект класса, чье имя "int". Обратите внимание, что мы не отправили метод getClass() объекту; мы использовали зарезервированное слово для встроенного примитивного типа (int) и, используя точечную нотацию, получили доступ к своему классу "поле". И это возвращает объект класса!

Ответ 2

int.class - тот же тип, что и Class<Integer> согласно спецификациям.

От Docs:

Примитивные типы Java (булевы, байты, char, короткие, int, long, float и double), а ключевое слово void также представлено как Class объекты.

От JLS 15.8.2:

15.8.2. Литералы классов

Литерал класса - это выражение, состоящее из имени класса, интерфейс, массив или примитивный тип или псевдо-тип void. по '.' и класс токенов.

Тип C.class, где C - это имя класса, интерфейса или тип массива, Class<C>.

Тип p.class, где p - имя примитивного типа, Class<B>, где B - тип выражения типа p после бокс преобразования.

Тип void.class Class<Void>.

Это ошибка времени компиляции, если именованный тип является переменной типа или параметризованный тип или массив, тип элемента которого является тип переменной или параметризованный тип.

Это ошибка времени компиляции, если именованный тип не обозначает тип который доступен и доступен в той области, в которой class literal.

Литерал класса оценивает объект класса для именованного типа (или для void), как определено определяющим загрузчиком класса класса текущего экземпляра.

Ответ 3

Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или примитивного типа, или псевдо-типа void, за которым следует `. ' и класс токенов.

  • Перечисление - это своего рода класс, а аннотация - это своего рода интерфейс.
  • Каждый массив также относится к классу, который отражается как объект класса, который совместно используется всеми массивами с тем же типом элемента и количеством измерений.
  • Примитивные типы Java (логические, байтовые, char, короткие, int, long, float и double) и
  • Ключевое слово void также

представлены как объекты класса.

Итак System.out.println(int.class); будет печатать int, тогда как System.out.println(Integer.class); будет печатать class java.lang.Integer.