2012-06-28 9 views
6

Ho alcuni problemi con un metodo che ha un parametro List tipizzato, ereditato da un'altra classe (tipizzata).Metodo con lista ed ereditarieta digitata

teniamolo semplice:

public class B<T> { 
    public void test(List<Integer> i) { 
    } 
} 

La classe B ha un T inutile generica, e test() vuole un elenco di numeri interi.

Ora, se faccio:

public class A extends B { 
    // don't compile 
    @Override 
    public void test(List<Integer> i) { 
    } 
} 

ottengo "Il metodo di prova (List) di tipo A deve avere la priorità o di implementare un metodo supertipo" l'errore, che non dovrebbero accadere.

Ma la rimozione del tipo di elenco funziona ... anche se non dipende dalla classe generica.

public class A extends B { 
    // compile 
    @Override 
    public void test(List i) { 

E anche definire l'inutile generica di seguito per utilizzare l'elenco digitato

public class A extends B<String> { 
    // compile 
    @Override 
    public void test(List<Integer> i) { 

Quindi sono all'oscuro, il generico di B dovrebbe avere alcuna influenza sul tipo di l'elenco dei test(). Qualcuno ha un'idea di cosa sta succedendo?

Grazie

+0

Credo che la tua risposta stia [qui] (http://stackoverflow.com/a/502770/248082). – nobeh

+0

Convenzionalmente [V maiuscola] 'Void' viene utilizzato per i parametri generici che non si desidera utilizzare. Ad esempio, che utilizza 'java.security.PreivilegedAction' senza restituire un valore (restituisce' null' - è l'unico riferimento 'Void' valido). –

risposta

8

Stai estendendo il tipo non elaborato di B, non quello generico. Il raw non ha un metodo test(List<Integer> i), ma un metodo test(List).

Se si passa a tipi non elaborati, tutti i generici vengono sostituiti da file non elaborati, indipendentemente dal fatto che il loro tipo sia stato compilato o meno.

per farlo correttamente, fare

public class A<T> extends B<T> 

Questa utilizzerà il tipo generico B<T>, che include il metodo che si desidera ignorare.

+0

Grazie. Non proprio logico dal momento che non stiamo usando T, ma i generici di Java hanno alcuni difetti di progettazione che dobbiamo affrontare. – PomPom

1

Quando si rimuove usare una classe senza farmaci generici (e utilizzare a crudo), tutti i farmaci generici da metodi della classe sono dimenticati.

dovuto questo motivo quando si informa il tipo generico nel secondo caso si ottiene il funzionamento.

questo:

class T<G> { 
    public void test(G g); 
} 

in questo caso:

class A extends T { 
} 

sarà simile a questa:

class T { 
    public void test(Object g); 
} 

Questo è stato un puzzle Java presentato il Google IO 2011 è possibile vedere il video here

+0

Il vero problema è che non stavo usando G ma una classe concreta. Ad ogni modo ho avuto la mia risposta – PomPom

+0

Stavi usando una classe grezza. –

Problemi correlati