java - Integer.class vs int.class
reflection primitive (4)
¿Cuál es la diferencia entre Integer.class
, Integer.TYPE
e int.class
?
según yo
-
Integer.class
es una referencia del objeto Clase Integer (Wrapper) - pero lo que entonces es
int.class
comoint
no es una clase, es un tipo primitivo. ¿Y a qué se refiereInteger.TYPE
?
De java.lang.Class.isPrimitive
API
Hay nueve objetos de Clase predefinidos para representar los ocho tipos primitivos y el vacío. Estos son creados por la Máquina Virtual Java y tienen los mismos nombres que los tipos primitivos que representan, a saber, booleano, byte, char, corto, int, largo, flotante y doble.
Solo se puede acceder a estos objetos a través de las siguientes variables finales estáticas públicas java.lang.Boolean.TYPE
, java.lang.Integer.TYPE
, etc.
En términos simples:
int -> Son primitivos ... para simples operaciones matemáticas. No puedes agregarlos a una colección.
Entero -> Son objetos en sí mismos ... son envoltorios para enteros. es decir, se pueden usar con colecciones (ya que son objetos). Son recogidos como objetos normales por el GC.
EDITAR:
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
Entonces, básicamente, ambos devuelven un int. Integer.TYPE simplemente devuelve el tipo primitivo de la clase Integer. Es cierto para cualquier clase de contenedor
Java maneja los tipos primitivos frente a los tipos de clase de forma esquizofrénica definiendo dos tipos para cada primitiva.
Por ejemplo, int
es el tipo primitivo y Integer
el tipo de clase. Cuando utiliza genéricos, se ve obligado a utilizar un tipo no primitivo, por lo que ArrayList<Integer>
está permitido pero ArrayList<int>
no.
Dado que a veces desea realizar la reflexión, esta dualidad da como resultado dos clases (¿cómo más puede inspeccionar un método public int foo ();
).
Digamos que tienes una clase:
public class Foo {
private Integer value;
public int value1 () {
return value;
}
public Integer value2 () {
return value;
}
}
Los dos métodos no siempre devolverán el mismo valor, ya que value2()
puede devolver null
y value1()
arrojará un error de tiempo de ejecución.
Integer.class
es, como dices, una referencia al objeto Class
para el tipo Integer
.
int.class
es, similitud, una referencia al objeto Class
para el tipo int
. Tienes razón de que esto no suena bien; todos los primitivos tienen un objeto Class
como caso especial. Es útil para la reflexión, si desea diferenciar entre foo(Integer value)
y foo(int value)
.
Integer.TYPE
(no Integer.type
, mind you) es solo un atajo para int.class
.
Puede obtener una idea de esto con un programa simple:
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));
}
}
Ejemplo de salida (será diferente cada vez, pero las dos primeras siempre serán iguales, y la tercera siempre será diferente):
366712642
366712642
1829164700