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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top