2012-03-29 12 views
83

domanda come sopra, scusa è probabilmente un duplicato ma non ho trovato un esempio con il <?> alla fine.Che cosa significa la classe <?> in Java?

Perché non dovresti usare solo Class come parametro?

+0

http://en.wikipedia.org/wiki/Wildcard_%28Java%29 – Anycorn

+0

http://stackoverflow.com/q/2024513/1140748 –

risposta

67

Class è una classe parametrizzabile, quindi è possibile utilizzare la sintassi Class<T> dove T è un tipo. Scrivendo Class<?>, stai dichiarando un oggetto Class che può essere di qualsiasi tipo (? è un carattere jolly). Il tipo Class è un tipo che contiene metainformation su una classe.

È sempre consigliabile fare riferimento a un tipo generico specificando il suo tipo specifico, utilizzando Class<?> si sta rispettando questa pratica (si è a conoscenza di Class per essere parametrizzabile) ma non si limita il parametro per avere un tipo specifico.

di riferimento su Generics e caratteri jolly: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

di riferimento su oggetti di classe e di riflessione (la caratteristica del linguaggio Java utilizzato per introspezione stesso): http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+3

Qual è il vantaggio di farlo semplicemente usando 'Class' senza un tipo? Sembrano rappresentare la stessa cosa. – ashes999

+0

Ho pensato che il punto di un generico è che non conosci il tipo di classe in anticipo. Altrimenti si definirà semplicemente una funzione per utilizzare un particolare tipo di classe per il parametro. Questo punto interrogativo non ha ancora senso. – Brain2000

+2

Non vi sono altri vantaggi se non dicendo al compilatore che "so che questa è una classe generica, ma non conosco o non mi interessa del tipo attuale, quindi invece di dare un tipo concreto, sto dando il'? 'carattere jolly.". Se non si attribuisce il carattere jolly, il compilatore presume che l'utente abbia dimenticato il tipo o non abbia saputo che la classe è generica e avviserà l'utente. – Kayaman

5

È un valore letterale generics. Significa che non si conosce il tipo di classe rappresentata da questa istanza Class, ma si sta ancora utilizzando la versione generica.

  • se conosceste la classe, usereste Class<Foo>. In questo modo è possibile creare una nuova istanza, ad esempio, senza eseguire il casting: Foo foo = clazz.newInstance();
  • se non si usano generici, si otterrà almeno un avvertimento (e non usare i generici è generalmente scoraggiato in quanto può portare a effetti secondari difficili da rilevare)
2

Ciò significa una classe con un tipo di qualcosa (sconosciuto).

Si consiglia di leggere java generics tutorial per arrivare a capire meglio

5

Significa il vostro riferimento di classe può contenere un riferimento a qualsiasi oggetto Class.

È praticamente lo stesso di "Classe" ma stai mostrando ad altre persone che leggono il tuo codice che non hai dimenticato di generici, vuoi solo un riferimento che possa contenere qualsiasi oggetto di Classe.

Bruce Eckel, Thinking in Java:

In Java SE5, Class <> è preferito su Class pianura, anche se sono equivalenti e la Classe pianura, come avete visto, non produce? un avvertimento del compilatore . Il vantaggio della Classe <?> È che il numero indica che non stai usando solo un riferimento di classe non specifico per incidente o per ignoranza. Hai scelto la versione non specifica.

+1

La citazione dice "La classe è preferibile rispetto alla semplice Classe" e "The beneficio della classe ". Sembra che il blockquote non sia d'accordo con le parentesi angolari. – MasterF

+0

Deve essere sfuggito. Risolto il problema ora: P –

3

In generici, un tipo sconosciuto è rappresentato dal carattere jolly "?". Leggi here per un esempio ufficiale.

42

Questo <?> è una bestia.Porta spesso alla confusione e agli errori, perché, quando lo vedi per la prima volta, inizi a credere, <?> è un jolly per qualsiasi tipo java. Che è .. non è vero. <?> è il tipo sconosciuto, una leggera e sgradevole differenza.

Non è un problema quando lo si utilizza con Class. Entrambe le linee di lavoro e compilare:

Class anyType = String.class; 
Class <?> theUnknownType = String.class; 

Ma - se cominciamo ad usarlo con le collezioni, poi vediamo strani errori compiletime:

List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed 
list.add("a String");     // doesn't compile ... 

nostro List<?> non è una raccolta, che è adatto per qualsiasi tipo di oggetto Può memorizzare solo un tipo: il "tipo sconosciuto" mistico. Che non è un tipo reale, di sicuro.