Подтвердить что ты не робот

Integer.class vs int.class

В чем разница между Integer.class, Integer.TYPE и int.class?

со мной

  • Integer.class - это ссылка объекта класса Integer (Wrapper)
  • но тогда int.class как int не является классом, это примитивный тип. И что означает Integer.TYPE?
4b9b3361

Ответ 1

Из java.lang.Class.isPrimitive API

Существует девять предопределенных объектов класса для представления восьми примитивных типов и void. Они создаются виртуальной машиной Java и имеют те же имена, что и примитивные типы, которые они представляют, а именно: boolean, byte, char, short, int, long, float и double.

Доступ к этим объектам можно получить только через следующие публичные статические конечные переменные java.lang.Boolean.TYPE, java.lang.Integer.TYPE и т.д.

Ответ 2

Integer.class является, как вы говорите, ссылкой на объект Class для типа Integer.

int.class - это сходство, ссылка на объект Class для типа int. Вы правы, что это звучит не так; все примитивы имеют объект Class как особый случай. Это полезно для отражения, если вы хотите рассказать разницу между foo(Integer value) и foo(int value).

Integer.TYPE (не Integer.TYPE, заметьте) - это просто ярлык для int.class.

Вы можете понять это с помощью простой программы:

public class IntClasses {
  public static void main(String[] args) {
    Class<Integer> a = int.class;
    Class<Integer> b = Integer.TYPE;
    Class<Integer> c = Integer.class;

    System.out.println(System.identityHashCode(a));
    System.out.println(System.identityHashCode(b));
    System.out.println(System.identityHashCode(c));
  }
}

Пример вывода (каждый раз он будет отличаться, но первые два всегда будут одинаковыми, а третий будет практически всегда отличаться):

366712642
366712642
1829164700

Ответ 3

В простых выражениях:

int → Используются примитивы для простых математических операций. Вы не можете добавить их к коллекции.

Целое число → Объекты сами по себе являются оболочками для ints. то есть, они могут использоваться с коллекциями (поскольку они являются объектами). Они есть собранные как обычные объекты GC.

ИЗМЕНИТЬ:

public static void main(String[] args) {
    int i = 5;
    System.out.println(int.class);

    Integer i1 = new Integer(5);
    System.out.println(Integer.TYPE);

}

O/P : int
      int

Итак, в основном, оба возвращают int. Integer.TYPE просто возвращает примитивный тип класса Integer. Это верно для любого класса-оболочки

Ответ 4

Java обрабатывает примитивные типы по сравнению с типами классов шизофреническим путем, определяя два типа для каждого примитива.

Например, int - это примитивный тип и Integer тип класса. Когда вы используете generics, вы вынуждены использовать непримитивный тип, поэтому ArrayList<Integer> разрешен, но ArrayList<int> нет.

Поскольку вы иногда хотите выполнить отражение, эта двойственность приводит к двум классам (как еще вы можете проверить метод public int foo ();).

Скажем, у вас есть класс:

public class Foo {

    private Integer value;

    public int value1 () {
        return value;
    }

    public Integer value2 () {
        return value;
    }

}

Два метода не всегда возвращают одно и то же значение, так как value2() может возвращать null и value1() будет вызывать ошибку времени выполнения.