Cosa significa Class <?> In Java?


Risposte:


109

Classè una classe parametrizzabile, quindi puoi usare la sintassi Class<T>dove Tè un tipo. Scrivendo Class<?>, dichiari un Classoggetto che può essere di qualsiasi tipo ( ?è un carattere jolly). Il Classtipo è 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 Classessere 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 Classoggetto e riflessione (la funzionalità del linguaggio Java utilizzata per introspeggersi): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


7
Qual è il vantaggio di fare questo semplicemente usando Classsenza un tipo? Sembrano rappresentare la stessa cosa.
ashes999,

1
Ho pensato che il punto centrale di un generico fosse che non conosci il tipo di classe in anticipo. Altrimenti si definirebbe semplicemente una funzione per utilizzare un tipo di classe particolare per il parametro. Questo punto interrogativo non ha ancora senso.
Brain2000,

5
Non ci sono altri vantaggi se non quello che stai dicendo al compilatore che "So che questa è una classe generica, ma non conosco né mi preoccupo del tipo reale, quindi invece di dare un tipo concreto sto dando il ?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.
Kayaman,

1
Qual è l'equivalente di KotlinClass<?>
JGuo

semplicemente Classnon può essere passato a un argomento di tipo Class<?>, quindi Class<?>è più conveniente per tutte le situazioni.
Petertc,

72

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.


8

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.


1
La citazione dice "La classe <?> È preferita alla semplice classe" e "Il vantaggio della classe <?>". Sembra che blockquote non sia d'accordo con le parentesi angolari.
Filip

1
Deve essere evaso. Risolto il problema ora: P
Sami Kuhmonen,

5

È un generico letterale. Significa che non conosci il tipo di classe Classrappresentato da questa istanza, ma stai ancora utilizzando la versione generica.

  • se conoscessi la lezione, lo useresti Class<Foo>. In questo modo puoi creare una nuova istanza, ad esempio, senza trasmettere:Foo foo = clazz.newInstance();
  • se non usi affatto i generici, riceverai almeno un avvertimento (e non usare i generici è generalmente sconsigliato in quanto potrebbe portare a effetti collaterali difficili da rilevare)

5

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


3

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

Dovresti leggere il tutorial java generics per capirlo meglio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.