2008-11-14 22 views
8

Tengo un bloque de código que funciona y quería preguntar qué está pasando exactamente aquí.Java Clase Tipo

Class<?> normalFormClass = null; 

--- --- añadido

El comodín "<?>" es la parte que es confuso para mí. ¿Por qué se usaría esto en lugar de no usarlo (genéricos)?

Respuesta

12

Eso significa que puede ser una clase de cualquier tipo. ? es un comodín que denota el conjunto de todos los tipos, o 'cualquiera'. Por lo que puede hacer más adelante

Integer normalForm = new Integer(); 
normalFormClass = normalForm.getClass(); 

o

String normalForm = new String(); 
normalFormClass = normalForm.getClass(); 

Si usted no es consciente de los genéricos en Java, lee http://java.sun.com/developer/technicalArticles/J2SE/generics/

En cuanto al por qué, yo creo que puede ser de expresar estrictamente que usted es usando genéricos en todas partes y su código no es compatible con versiones anteriores de Java, o tal vez para cerrar algunos IDE felices de activación. Y sí,

Class foo 

y

Class<?> foo 

son equivalentes.

+0

gran ejemplo! Todavía estoy aprendiendo los conceptos básicos de Java y siempre me he preguntado acerca de las líneas de código con estos corchetes. –

+0

Gracias Sí ... Estoy al tanto de los genéricos, pero? el comodín era lo que quería asegurarme de que entendía completamente. –

+0

Excepto que no puede crear una nueva clase como esa;) Maybe normalFormClass = obj.getClass(); – erickson

0

Dudo que esto sea tarea, ya que nunca he estado en una clase que haya hablado sobre la reflexión.

Pero esta es una simple asignación nula. No hace nada.

2

¿Clase o clase <?> Funciona igual de bien. Una razón para usar esto último es deshacerse de algunas advertencias que el ide o el compilador le lanzarían al usar el primer formulario.

+0

Lo tengo y tiene sentido –

4

Además, la versión genérica

Class<?> normalClass = null; 

es más o menos equivalente a la versión tipo de crudo,

Class normalClass = null; 

la diferencia principal es que el último será compatible con versiones de Java que no lo hacen admiten genéricos, como Java 1.4.

+0

Y por lo tanto se puede utilizar para dejar en claro que no está escribiendo 1.4 código compatible, por ejemplo. –

+0

Gracias esto es mucho más claro –

3

Clase <T> significa que desde JDK 1.5, Clase se genera por el tipo que define la clase. Una forma de pensar sobre esto es que Class es una fábrica para crear instancias de su tipo.
Específicamente, una clase <T> crea instancias de tipo T a partir del método Class.newInstance().

A partir de JDK 1.5 en adelante, Java Language Spec recomienda no utilizar tipos sin formato. Por lo tanto, es muy recomendable que al tratar con una instancia de clase de tipo desconocido, debe referirse a ella como "Clase <? >" y no solo "Clase". Por supuesto, si realmente conoce el tipo o algún límite, puede encontrar algunos beneficios al especificarlo.

0

La clase es una clase parametrizable, por lo tanto puede usar la clase de sintaxis donde T es un tipo. Al escribir Class, declaras un objeto Class que puede ser de cualquier tipo (? Es un comodín). El tipo de clase es un tipo que contiene metainformación sobre una clase.

Siempre es una buena práctica referirse a un tipo genérico especificando su tipo específico, al usar Class usted respeta esta práctica (sabe que Class debe ser parametrizable) pero no está restringiendo su parámetro para tener un tipo específico.

de referencia sobre los genéricos y los comodines: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

de referencia sobre el objeto de clase y la reflexión (la función del lenguaje Java utilizado para introspect sí mismo): http://java.sun.com/developer/technicalArticles/ALT/Reflection/