java reflection primitive

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

  1. Integer.class es una referencia del objeto Clase Integer (Wrapper)
  2. pero lo que entonces es int.class como int no es una clase, es un tipo primitivo. ¿Y a qué se refiere Integer.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