2012-09-19 4 views

risposta

3

I farmaci generici sono molto difficili.

In questo caso, Arrays.asList restituirà un List<Class<MyOwnException>>, che non è uguale a List<Class<? extends Throwable>>.

Il loro comportamento sarà diverso poiché il tipo List<Class<? extends Throwable>> consentirebbe di aggiungere oggetti che estendono Throwable ma List<Class<MyOwnException>> accetta solo oggetti di tipo MyOwnException.

+1

che non è vero che devono essere "esattamente lo stesso": 'Lista x = new ArrayList ();' compila, come fa 'Elenco x = new ArrayList (); ' – Bohemian

+0

Hai ragione, Bohemian, ho appena corretto la seconda parte, il che non era vero. Cattive ore per rispondere rapidamente. Grazie! – enTropy

0

Se il secondo esempio dovesse funzionare, sarebbe consentire codice come questo:

Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
exs.add(IOException.class); 

vedere il problema? Arrays.asList() restituirebbe un List<Class<MyOwnException>> e quindi si proverebbe a inserire uno Class<IOException> in quello. Questo è ovviamente un tipo non corrispondente.

1

La prima linea funziona perché il tipo di elemento del lato destro della assegnazione (del ArrayList) è Class<? extends Throwable> che permette di aggiungere qualsiasi tipo di Class<? extends Throwable> oggetto, compreso il vostro MyOwnException. Si potrebbe anche aggiungere alla prima riga Collection un Exception.class o un NullPointerException.class, ecc

Ma la seconda linea è molto più severe: si dispone di un Collection<Class<? extends Throwable>> che potrebbe contenere un Class<Exception>, un Class<NullPointerException>, ecc e si vuole mettere in posizionare un Collection<Class<MyOwnException>> che non permette di Class<Exception>, ecc

6

il motivo si tratta di un errore è che Java è inferire il tipo sbagliato, ma si può fare è compilare, senza colata, specificando il tipo di chiamata al metodo digitato Arrays.asList():

Collection<Class<? extends Throwable>> exs 
    = Arrays.<Class<? extends Throwable>>asList(Exception.class); // compiles 

Senza specificare il tipo, java deduce il tipo di elemento di raccolta per essere Class<Exception>, che è non assegnabile a Collection<Class<? extends Throwable>>.

Ricorda con i generici che se B estende A, List<B> fa non estendono List<A>.

+0

+1, ma ho una domanda. Perché una variabile locale non è definita come 'Classe clazz' fai il trucco in 'Arrays.asList (clazz)'? – Raffaele

+1

@Raffaele Poiché il tipo viene dedotto dal parametro di 'asList' come' Classe ', ma è necessario che sia diverso – Bohemian

+0

In realtà il compilatore di Eclipse dice' Elenco > a List > ', non menziona' Classe ', ma non riesco a interpretare la parte * capture # 1 * ... – Raffaele

1

Arrays.asList(MyOwnException.class) è considerato avere il tipo List<Class<MyOwnException>>, che non è compatibile con List<Class<? extends Throwable>> poiché i parametri di tipo sono diversi.

Se si mette un jolly al primo livello, dovrebbe funzionare:

Collection<? extends Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
Problemi correlati