2009-06-17 12 views

Respuesta

34

Es lo mismo que con todos los tipos genéricos y primas:

Class   // An unknown class (raw type) 
Class<?>  // An unknown class (generic version) 
Class<String> // The String class 

En este caso especial, no hay mucha diferencia práctica entre Class y Class<?> porque ambos denotan una clase desconocida. Dependiendo de las declaraciones existentes, el compilador puede exigir un tipo genérico en lugar de un tipo sin formato.

Pero: Desde Java 1.5 debe utilizar la forma genérica siempre que sea posible. Class<?> indica claramente que se refiere a "una clase desconocida", Class<String> cleary indica que se refiere a la clase String. Un Class crudo podría significar ambos.

Al final no hace mucha diferencia para el compilador pero hace una gran diferencia al hacer las intenciones de su código más comprensibles y mantenibles.

+2

Debe evitar la clase de clase siempre que sea posible ... –

+26

Usted debe evitar el uso de reglas sin explicaciones siempre que sea posible. –

10

Clase javadoc:

Parámetros Tipo: T - el tipo de la clase de modelado por este objeto Class. Por ejemplo, el tipo de String.class es Class<String>. Use Class<?> si la clase que se modela es desconocida.

El uso de Class sin el parámetro tipo es similar al uso de cualquier clase genérica (Map, List, etc.) sin el parámetro de tipo - ya sea que es un-1.5 pre uso de legado o es sólo un segmento de código que hace no me importa el tipo de fundición sin marcar.

2

La clase <?> muestra que está escribiendo intencionadamente código de nivel 5 de Java que no sabe ni le importa con qué clase está tratando. Dejarlo hace que parezca un código o código antiguo escrito por alguien que aún no ha aprendido los genéricos.

1

"parece código o código antiguo escrito por alguien que aún no ha aprendido los genéricos". Esta es una declaración correcta. Clase (pronunciada "clase de desconocido"), es decir, una clase cuyo tipo coincide con cualquier cosa. Se llama comodín por razones obvias.

por ejemplo:

public void drawAll(List<Shape> shapes) { 
    for (Shape s: shapes) { 
     s.draw(this); 
    } 
} 

reglas de tipo dicen que drawAll() sólo puede ser llamado en las listas de Shape exactamente: no puede, por ejemplo, ser llamado, por ejemplo, un List<Circle>. Eso es desafortunado, ya que todo lo que hace el método es leer formas de la lista, por lo que podría ser llamado en un List<Circle>.

Lo que realmente queremos es que el método acepte una lista de cualquier tipo de forma.

public void drawAll (List <? extends Shape> shapes) { 

} 

Leer más: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

Cuestiones relacionadas