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 Classcomo 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 Classcomo parámetro?
Respuestas:
Classes una clase parametrizable, por lo tanto, puede usar la sintaxis Class<T>donde Tes un tipo. Al escribir Class<?>, está declarando un Classobjeto que puede ser de cualquier tipo ( ?es un comodín). El Classtipo 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 Classque 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 Classobjeto 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
Classsin 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<?>
Classno 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 Classrepresenta 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();