Che cosa è una conversione di cattura in Java e qualcuno può darmi esempi?
Domanda
ho notato JLS parla di 5.1 .10 acquisizione di conversione , ma non riesco a capire che cosa sono.
Qualcuno può loro mi spieghi / dare esempi?
Soluzione
conversione Capture è stato progettato per rendere i caratteri jolly (in farmaci generici), ?
utile.
Supponiamo di avere la seguente classe:
public interface Test<T> {
public void shout(T whatever);
public T repeatPreviousShout();
}
e da qualche parte sul nostro codice abbiamo,
public static void instantTest(Test<?> test) {
System.out.println(test.repeatPreviousShout());
}
A causa test
non è un Test
crudo e dal repeatPreviousShout()
in "senno di poi" restituisce un ?
, il compilatore sa che c'è un T
che serve come parametro tipo per Test
.
Questo T
è per alcuni T
sconosciuto in modo che il compilatore cancella il tipo sconosciuto (per carattere jolly, sostituisce con Object
)., Ritorna quindi repeatPreviousShout()
un Object
.
Ma se avessimo,
public static void instantTest2(Test<?> test) {
test.shout(test.repeatPreviousShout());
}
Il compilatore ci darebbe un errore di qualcosa come Test<capture#xxx of ?> cannot be applied
(dove xxx
è un numero, ad esempio 337
).
Questo è perché i tentativi del compilatore per fare il controllo di sicurezza di tipo on shout()
ma dal momento che ha ricevuto una wildcard, che non sa cosa T
rappresenta, quindi si crea un segnaposto chiamato cattura di .
qui (teoria e pratica Java: Andare selvaggio con i generici, parte 1) , si afferma chiaramente:
conversione Capture è ciò che permette la compilatore di produrre un segnaposto digitare nome per il carattere jolly catturato, cosicché inferenza può dedurre a essere quel tipo.
Spero che questo ti aiuta.
Altri suggerimenti
Un tipo parametrico che coinvolge argomenti di tipo jolly è davvero un tipo unione. Ad esempio
List<? extends Number> = Union{ List<S> | S <: Number }
In 2 casi, invece di usare List<? extends Number>
, Java utilizza la versione List<S>
catturato, dove S è una variabile di tipo appena creato con Number
limite superiore.
(1) http://java.sun.com /docs/books/jls/third_edition/html/expressions.html
Per limitare il tipo di un'espressione. Se il tipo di un'espressione è List<? extends Number>
, sappiamo per certo che il tipo di esecuzione dell'oggetto è in realtà un List<S>
per un certo tipo di calcestruzzo S (S <: Number>
). Così usi compilatore List<S>
invece, per eseguire analisi più accurata tipo.
conversione Capture viene applicato a ogni espressione singolarmente; Questo porta a qualche risultato muto:
<T> void test1(List<T> a){}
<T> void test2(List<T> a, List<T> b){}
List<?> x = ...;
test1(x); // ok
test2(x, x); // error
(2) http: // java .sun.com / docs / libri / JLS / third_edition / html / typesValues.html # 4.10.2
Nel sottotipo controllo A :< B
dove A
coinvolge argomenti jolly. Ad esempio,
List<? extends Number> :< B
<=>
Union{ List<S> | S <: Number} :< B
<=>
List<S> :< B, for all S <: Number
Quindi, in effetti, stiamo verificando la versione catturato di tipo A