Mi pregunta es como la anterior. Lo sentimos, probablemente sea un duplicado, pero no pude encontrar un ejemplo con <?>
el final.
¿Por qué no lo usarías simplemente Class
como parámetro?
Mi pregunta es como la anterior. Lo sentimos, probablemente sea un duplicado, pero no pude encontrar un ejemplo con <?>
el final.
¿Por qué no lo usarías simplemente Class
como parámetro?
Respuestas:
Class
es una clase parametrizable, por lo tanto, puede usar la sintaxis Class<T>
donde T
es un tipo. Al escribir Class<?>
, está declarando un Class
objeto que puede ser de cualquier tipo ( ?
es un comodín). El Class
tipo 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 usarlo Class<?>
respeta esta práctica (sabe Class
que es parametrizable) pero no restringe su parámetro para que tenga un tipo específico.
Referencia sobre genéricos y comodines: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Referencia sobre Class
objeto y reflexión (la característica del lenguaje Java utilizada para introspectarse a sí mismo): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
sin un tipo? Parecen representar lo mismo.
?
comodín". . Si no le da el comodín, el compilador asume que olvidó el tipo o no sabía que la clase era genérica y le advertirá al respecto.
Class<?>
Class
no se puede pasar a un argumento de qué tipo es Class<?>
, por lo que Class<?>
es más conveniente para todas las situaciones.
Esta <?>
es una bestia A menudo conduce a confusión y errores, porque, cuando lo ves por primera vez, comienzas a creer, <?>
es un comodín para cualquier tipo de Java . Lo cual no es cierto. <?>
Es el tipo desconocido , una ligera y desagradable diferencia.
No es un problema cuando lo usas con Class
. Ambas líneas funcionan y compilan:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Pero , si comenzamos a usarlo con colecciones, entonces vemos errores extraños en tiempo de compilación:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
La nuestra List<?>
no es una colección, que es adecuada para cualquier tipo de objeto. Solo puede almacenar un tipo: el místico "tipo desconocido". Que no es un tipo real, seguro.
Significa que su referencia de clase puede contener una referencia a cualquier objeto de clase.
Básicamente es lo mismo que "Clase", pero estás mostrando a otras personas que leen tu código que no te olvidaste de los genéricos, solo quieres una referencia que pueda contener cualquier objeto de Clase.
Bruce Eckel, Pensando en Java:
En Java SE5, se prefiere la clase <?> Sobre la clase simple, a pesar de que son equivalentes y la clase simple, como viste, no produce una advertencia del compilador. El beneficio de la Clase <?> Es que indica que no solo estás usando una referencia de clase no específica por accidente o por ignorancia. Elegiste la versión no específica.
Es un literal genérico . Significa que no sabe el tipo de clase que Class
representa esta instancia, pero todavía está utilizando la versión genérica.
Class<Foo>
. De esa manera, puede crear una nueva instancia, por ejemplo, sin emitir:Foo foo = clazz.newInstance();