2013-06-27 14 views
8

Da this Oracle Java tutorial:Catturare i caratteri jolly in Java generici

L'esempio WildcardError produce un errore di acquisizione quando compilati:

public class WildcardError { 

    void foo(List<?> i) { 
     i.set(0, i.get(0)); 
    } 
} 

Dopo questa dimostrazione di errore, che si risolvono il problema utilizzando un metodo di supporto:

public class WildcardFixed { 
    void foo(List<?> i) { 
     fooHelper(i); 
    } 

    // Helper method created so that the wildcard can be captured 
    // through type inference. 
    private <T> void fooHelper(List<T> l) { 
     l.set(0, l.get(0)); 
    } 
} 

Primo, th ey dire che il parametro lista di input (i) è visto come un Object:

In questo esempio, il compilatore elabora il parametro di input i come di oggetto.

Perché allora i.get(0) non restituisce un Object? se fosse già passato come tale?

Inoltre, che senso ha utilizzare un <?> quando è necessario utilizzare un metodo di supporto utilizzando <T>. Non sarebbe meglio utilizzare direttamente T che può essere dedotto?

+0

Questo è ciò che Eclipse mi dà: 'Il metodo set (int, capture # 1 di?) Nel tipo List Non è applicabile per gli argomenti (int, capture # 2 di ?) "Sembra ancora più ridicolo. –

+0

Ho appena scritto una [risposta] (http://stackoverflow.com/questions/30797805/understanding-a-captured-type-in-java/30798066#30798066) che spiega l'acquisizione di caratteri jolly per un'altra domanda. Questa informazione sembra rilevante anche per questa domanda. – Lii

risposta

4

List<?> significa elenco di oggetto di tipo sconosciuto, non è lo stesso di List<Object>.

Poiché non sappiamo il tipo di elementi nell'elenco il risultato di i.get(0) è considerato da Java come Object e non è possibile aggiungere Object a List<?>. Nel caso in cui il tuo Java potrebbe essere più intelligente, ma in codice più complesso con i caratteri jolly <?> è facile non renderlo sicuro.

+0

Per quanto mi ricordo tale caso è spiegato con dettagli in "Effective Java" di Joshua Bloch –

+0

** Elenco ** è equivalente a ** Elenco ** – Raf