Minha pergunta é como acima. Desculpe, provavelmente é uma duplicata, mas não consegui encontrar um exemplo com o <?>
no final.
Por que você não usaria apenas Class
como parâmetro?
Minha pergunta é como acima. Desculpe, provavelmente é uma duplicata, mas não consegui encontrar um exemplo com o <?>
no final.
Por que você não usaria apenas Class
como parâmetro?
Respostas:
Class
é uma classe parametrizável, portanto, você pode usar a sintaxe Class<T>
onde T
é um tipo. Ao escrever Class<?>
, você está declarando um Class
objeto que pode ser de qualquer tipo ( ?
é um curinga). O Class
tipo é um tipo que contém meta-informações sobre uma classe.
É sempre uma boa prática se referir a um tipo genérico, especificando o tipo específico dele, usando Class<?>
você está respeitando essa prática (você sabe Class
que é parametrizável), mas você não está restringindo seu parâmetro a um tipo específico.
Referência sobre genéricos e curingas: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Referência sobre Class
objeto e reflexão (o recurso da linguagem Java usado para se introspectar): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
sem um tipo? Eles parecem representar a mesma coisa.
?
curinga". . Se você não fornecer o curinga, o compilador assume que você esqueceu o tipo ou não sabia que a classe era genérica e o alertará sobre isso.
Class<?>
Class
não pode ser passado para um argumento que tipo é Class<?>
, então Class<?>
é mais conveniente para todas as situações.
Isso <?>
é uma fera. Isso geralmente gera confusão e erros, porque, quando você o vê pela primeira vez e começa a acreditar, <?>
é um curinga para qualquer tipo de java . O que não é verdade. <?>
é o tipo desconhecido , uma diferença leve e desagradável.
Não é um problema quando você o usa Class
. Ambas as linhas funcionam e compilam:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Mas - se começarmos a usá-lo com coleções, veremos erros estranhos de compilação:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Nossa List<?>
coleção não é adequada para qualquer tipo de objeto. Só pode armazenar um tipo: o místico "tipo desconhecido". O que não é do tipo real, com certeza.
Isso significa que sua referência de classe pode conter uma referência a qualquer objeto de classe.
É basicamente o mesmo que "Class", mas você está mostrando a outras pessoas que leem seu código que não esqueceu os genéricos, apenas deseja uma referência que possa conter qualquer objeto de Class.
Bruce Eckel, Pensando em Java:
No Java SE5, a classe <?> É preferida à classe simples, mesmo que sejam equivalentes e a classe simples, como você viu, não produz um aviso do compilador. O benefício da classe <?> É que indica que você não está apenas usando uma referência de classe não específica por acidente ou por ignorância. Você escolheu a versão não específica.
É um literal genérico . Isso significa que você não sabe o tipo de classe que esta Class
instância está representando, mas ainda está usando a versão genérica.
Class<Foo>
. Dessa forma, você pode criar uma nova instância, por exemplo, sem transmissão:Foo foo = clazz.newInstance();