La mia domanda è come sopra. Scusate, probabilmente è un duplicato ma non sono riuscito a trovare un esempio con <?>
la fine.
Perché non dovresti usare solo Class
come parametro?
La mia domanda è come sopra. Scusate, probabilmente è un duplicato ma non sono riuscito a trovare un esempio con <?>
la fine.
Perché non dovresti usare solo Class
come parametro?
Risposte:
Class
è una classe parametrizzabile, quindi puoi usare la sintassi Class<T>
dove T
è un tipo. Scrivendo Class<?>
, dichiari un Class
oggetto che può essere di qualsiasi tipo ( ?
è un carattere jolly). Il Class
tipo è un tipo che contiene meta-informazioni su una classe.
È sempre buona norma fare riferimento a un tipo generico specificando il suo tipo specifico, utilizzando Class<?>
si rispetta questa pratica (si è consapevoli di Class
essere parametrizzabili) ma non si sta limitando il parametro per avere un tipo specifico.
Riferimenti su generici e caratteri jolly: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Riferimento su Class
oggetto e riflessione (la funzionalità del linguaggio Java utilizzata per introspeggersi): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
senza un tipo? Sembrano rappresentare la stessa cosa.
?
carattere jolly". . Se non si fornisce il carattere jolly, il compilatore presuppone che si sia dimenticato il tipo o non si sapesse che la classe era generica e che verrà avvisata.
Class<?>
Class
non può essere passato a un argomento di tipo Class<?>
, quindi Class<?>
è più conveniente per tutte le situazioni.
Questa <?>
è una bestia Spesso porta a confusione ed errori, perché, quando lo vedi per primo, poi inizi a credere, <?>
è un jolly per qualsiasi tipo di Java . Che non è ... vero. <?>
è il tipo sconosciuto , una leggera e brutta differenza.
Non è un problema quando lo usi con Class
. Entrambe le linee funzionano e compilano:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Ma - se iniziamo a usarlo con le raccolte, vediamo strani errori di compilazione:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
La nostra List<?>
non è una collezione, adatta a qualsiasi tipo di oggetto. Può memorizzare solo un tipo: il mistico "tipo sconosciuto". Che non è un tipo reale, di sicuro.
Significa che il tuo riferimento di classe può contenere un riferimento a qualsiasi oggetto di classe.
È praticamente lo stesso di "Class" ma stai mostrando ad altre persone che leggono il tuo codice che non hai dimenticato i generici, vuoi solo un riferimento che possa contenere qualsiasi oggetto Class.
Bruce Eckel, pensando in Java:
In Java SE5, la classe <?> È preferita alla semplice classe, anche se sono equivalenti e la semplice classe, come hai visto, non produce un avviso del compilatore. Il vantaggio di Class <?> È che indica che non stai usando un riferimento di classe non specifico per caso o per ignoranza. Hai scelto la versione non specifica.
È un generico letterale. Significa che non conosci il tipo di classe Class
rappresentato da questa istanza, ma stai ancora utilizzando la versione generica.
Class<Foo>
. In questo modo puoi creare una nuova istanza, ad esempio, senza trasmettere:Foo foo = clazz.newInstance();