2013-10-12 9 views
9

La documentazione per il metodo di oggetto "public final Class<?> getClass()" dice:Cosa si intende per "cancellazione del tipo statico dell'espressione su cui è chiamato" nei documenti getClass()?

Il tipo di risultato effettivo è di classe <? estende | X | > dove | X | è la cancellazione del tipo statico dell'espressione su cui getClass è chiamato. Ad esempio, in questo frammento di codice non è richiesto il cast:

Non capisco la spiegazione, in particolare per quanto riguarda ciò che | X | si dice che sia "la cancellazione del tipo statico dell'espressione su cui si chiama getClass".

Quale forma di notazione è | X | ? O forse, dove altrimenti sarebbe | X | si usa la notazione di tipo?

+3

La notazione '| X |' è stata utilizzata come _meta-variabile_, segnaposto, al di fuori della sintassi java. In Math on forse userebbe una lettera greca. –

risposta

6

Il linguaggio Java Specification mandates che questo metodo viene trattato in modo speciale dal compilatore:

Il metodo getClass restituisce l'oggetto Class che rappresenta la classe dell'oggetto.

Un oggetto Class esiste per ogni tipo di riferimento. Può essere utilizzato, ad esempio, per scoprire il nome completo di una classe, i suoi membri, la sua superclasse immediata e tutte le interfacce implementate.

Il tipo di un'espressione di chiamata di metodo di getClass è Class<? extends |T|> dove T è la classe o l'interfaccia ricercata (§15.12.1) per getClass.

Quindi il tipo di ritorno di getClass è il tipo statico (in fase di compilazione) dell'espressione getClass() viene richiamato su. Per esempio:

String s = ""; 
Object o = s; 
Class<? extends String> sc = s.getClass(); // ok 
Class<? extends Object> oc = o.getClass(); // ok 
oc = sc; // ok 
sc = o.getClass(); // not ok 
sc = oc; // not ok 

La notazione |X| è defined nelle specifiche come segue:

Type cancellazione è una mappatura da tipi (eventualmente inclusi tipi parametrici e digitare variabili) ai tipi (che sono tipi non parametrici o digitare variabili). Scriviamo |T| per la cancellazione di tipo T. La mappatura cancellazione è definito come segue:

  • la cancellazione di un tipo parametrico (§4.5) G<T1,...,Tn> è |G|.

  • La cancellazione di un tipo nidificato T.C è |T|.C.

  • La cancellazione di un array di tipo T[] è |T|[].

  • La cancellazione di una variabile di tipo (§4.4) è la cancellazione del limite più a sinistra.

  • La cancellazione di ogni altro tipo è il tipo stesso.

Ad esempio, se si ha:

List<String> list = ...;  

l'espressione list.getClass() è di tipo Class<? extends List> anziché Class<? extends List<String>>.

7

Si consideri il seguente esempio:

List<Integer> test = new ArrayList<Integer>(); 
Class<? extends List> clazz = test.getClass(); 

tipo statico di test (the expression on which getClass() is called) è List<Integer> cui la cancellazione è List (vedi type erasure). Si noti che il tipo dinamico (o runtime) di test è ArrayList e il tipo di runtime di clazz sarà Class<ArrayList>.

Quindi, Class<? extends |X|> in questo caso è Class<? extends List>.

+0

Perfetto esempio, grazie. –

Problemi correlati