В чем разница между Integer.class, Integer.TYPE и int.class?
со мной
-
Integer.class- это ссылка объекта класса Integer (Wrapper) - но тогда
int.classкакintне является классом, это примитивный тип. И что означаетInteger.TYPE?
В чем разница между Integer.class, Integer.TYPE и int.class?
со мной
Integer.class - это ссылка объекта класса Integer (Wrapper)int.class как int не является классом, это примитивный тип. И что означает Integer.TYPE?Из java.lang.Class.isPrimitive API
Существует девять предопределенных объектов класса для представления восьми примитивных типов и void. Они создаются виртуальной машиной Java и имеют те же имена, что и примитивные типы, которые они представляют, а именно: boolean, byte, char, short, int, long, float и double.
Доступ к этим объектам можно получить только через следующие публичные статические конечные переменные java.lang.Boolean.TYPE, java.lang.Integer.TYPE и т.д.
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
В простых выражениях:
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. Это верно для любого класса-оболочки
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() будет вызывать ошибку времени выполнения.