2012-03-29 24 views
83

pregunta como la anterior, lamento que sea probablemente un duplicado pero no pude encontrar un ejemplo con el <?> al final.¿Qué significa la clase <?> en Java?

¿Por qué no debería simplemente usar Class como parámetro?

+0

http://en.wikipedia.org/wiki/Wildcard_%28Java%29 – Anycorn

+0

http://stackoverflow.com/q/2024513/1140748 –

Respuesta

67

Class es una clase parametrizable, por lo tanto, se puede utilizar la sintaxis Class<T> donde T es un tipo. Al escribir Class<?>, está declarando un objeto Class que puede ser de cualquier tipo (? es un comodín). El tipo Class es un tipo que contiene metainformación sobre una clase.

Siempre es una buena práctica para referirse a un tipo genérico especificando su tipo específico, mediante el uso de Class<?> estás respetando esta práctica (que está consciente de Class ser parametrizable) pero no se está restringiendo su parámetro a 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 una introspección en sí): http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+3

¿Cuál es el beneficio de hacer esto simplemente usando 'Clase 'sin un tipo? Parecen representar lo mismo. – ashes999

+0

Pensé que el objetivo de un genérico es que usted no sabe el tipo de clase por adelantado. De lo contrario, simplemente definiría una función para usar un tipo de clase particular para el parámetro. Este signo de interrogación aún no tiene sentido. – Brain2000

+2

No hay otro beneficio, excepto que le está diciendo al compilador que "sé que esta es una clase genérica, pero no sé o no me importa el tipo real, entonces, en lugar de dar un tipo concreto, ¿estoy dando el'? 'comodín.". Si no le da el comodín, el compilador asume que olvidó el tipo o que no sabía que la clase era genérica y le avisará al respecto. – Kayaman

5

Es un literal generics. Significa que no conoce el tipo de clase que está representando esta instancia Class, pero todavía está utilizando la versión genérica.

  • si conociera la clase, usaría Class<Foo>. De esta forma, puede crear una instancia nueva, por ejemplo, sin conversión: Foo foo = clazz.newInstance();
  • si no usa genéricos, recibirá una advertencia al menos (y no se recomienda el uso de medicamentos genéricos, ya que puede conducir a efectos secundarios difíciles de detectar)
2

Eso significa una clase con un tipo de cualquier cosa (desconocida).

Debe leer java genéricos tutorial para llegar a comprenderla mejor

5

Significa su referencia Clase puede contener una referencia a un objeto de clase.

Básicamente es lo mismo que "Clase" pero le está mostrando a otras personas que leen su código que no se olvidó de los genéricos, solo desea una referencia que pueda contener cualquier objeto de clase.

Bruce Eckel, Pensando en Java:

En Java SE5, Clase <> se prefiere a la clase normal, a pesar de que son equivalentes y la clase normal, como se vio, no produce? una advertencia del compilador . ¿El beneficio de la clase <?> Es que indica que no solo está utilizando una referencia de clase no específica por accidente , o por ignorancia. Usted eligió la versión no específica.

+1

La cita dice "Clase es preferible a la clase normal" y "The beneficio de la clase ". Parece que blockquote no está de acuerdo con los corchetes angulares. – MasterF

+0

Necesita ser escapado. Se corrigió ahora: P –

3

En los genéricos, un tipo desconocido está representado por el carácter comodín "?". Lee here para un ejemplo oficial.

42

Esta <?> es una bestia.A menudo conduce a confusión y errores, porque cuando lo ves primero, luego empiezas a creer, <?> es un comodín para cualquier tipo de java. Lo cual no es verdad. <?> es el tipo desconocido, una diferencia leve y desagradable.

No es un problema cuando lo usa con Class. Ambas líneas de trabajo y compilar:

Class anyType = String.class; 
Class <?> theUnknownType = String.class; 

Pero - si comenzamos a usarlo con las colecciones, entonces vemos errores en tiempo de compilación extrañas:

List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed 
list.add("a String");     // doesn't compile ... 

Nuestra List<?> no es una colección, que es adecuado para cualquier tipo de objeto Solo puede almacenar un tipo: el místico "tipo desconocido". Que no es un tipo real, seguro.