2012-03-30 9 views
5

Entiendo lo que son las envolturas, pero de la documentación parece que usted puede obtener una instancia de un objeto de clase de tipo int. ¿Esto devuelve el contenedor o algún tipo de instancia de clase de int? Porque no tendría sentido si lo hiciera, debido a los genéricos y el borrado de tipos. ¿No es verdad que solo puedes obtener instancias de clase de clases reales y no primitivas? Cuando dicen representar, ¿quieren decir envoltorio de otra cosa?¿Qué devuelve int.class

Aquí es lo que dice el JavaDoc, y por qué estoy confundido

TYPE 

public static final Class TYPE 

    The Class instance representing the primitive type int. 

    Since: 
     JDK1.1 
+1

que no siguen la lógica de la "debida a los genéricos y el tipo de borrado ... ¿no es cierto que solo puedes obtener instancias 'Class' de clases reales [y] no primitivas? Los genéricos y el borrado de tipos no tienen nada que ver con la diferencia entre clases y primitivas. –

+1

Le va a gustar 'void.class' :-) – Thilo

Respuesta

7

¿No es cierto que sólo se puede obtener instancias de clases de clases real y no son primitivos?

Tipo de.

Pero a veces debe tener algunos metadatos para "entero primitivo". Por ejemplo, al mirar la firma del método. Luego obtendrá un Class[] para los parámetros, y de alguna manera necesita diferenciar entre public void test(Integer x) y public void test(int x).

Para facilitar esto, hay instancias de clases especiales para los tipos primitivos.

Para llevar esto un paso más allá, incluso hay java.lang.Void.TYPE:

Class<Void> x = void.class; 

perspicaz Javadoc:

/** 
* Determines if the specified <code>Class</code> object represents a 
* primitive type. 
* 
* <p> There are nine predefined <code>Class</code> objects to represent 
* the eight primitive types and void. These are created by the Java 
* Virtual Machine, and have the same names as the primitive types that 
* they represent, namely <code>boolean</code>, <code>byte</code>, 
* <code>char</code>, <code>short</code>, <code>int</code>, 
* <code>long</code>, <code>float</code>, and <code>double</code>. 
* 
* <p> These objects may only be accessed via the following public static 
* final variables, and are the only <code>Class</code> objects for which 
* this method returns <code>true</code>. 
* 
* @return true if and only if this class represents a primitive type 
* 
* @see  java.lang.Boolean#TYPE 
* @see  java.lang.Character#TYPE 
* @see  java.lang.Byte#TYPE 
* @see  java.lang.Short#TYPE 
* @see  java.lang.Integer#TYPE 
* @see  java.lang.Long#TYPE 
* @see  java.lang.Float#TYPE 
* @see  java.lang.Double#TYPE 
* @see  java.lang.Void#TYPE 
* @since JDK1.1 
*/ 
public native boolean isPrimitive(); 
+2

A veces también debe tener cuidado con estos tipos de clases especiales. Una vez escribí un código donde llamé a .getSuperclass() pensando que estaría bien, porque todo viene de un Objeto, ¿no? Nop. – xxpor

+0

Me parece interesante que 'Integer.TYPE' se declare como' Clase 'en lugar de' Clase '- parece un poco erróneo. –