В чем разница между 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()
будет вызывать ошибку времени выполнения.