Le risposte di cui sopra praticamente rispondere alla sua domanda, ma se si vuole un esempio specifico di un caso in cui l'inferenza di tipo generico di Java non riesce e expli citamente affermando in questo modo salva la situazione, considerare le seguenti definizioni di classe:
public class A { }
public class B extends A { }
public class C extends A { }
Poi il seguente codice funziona bene (vale a dire, l'inferenza dei tipi di Java riesce):
List<Class<? extends A>> list = ImmutableList.of(B.class, C.class);
Ma per il seguente , non riesce a compilare:
List<Class<? extends A>> list = ImmutableList.of(B.class);
Esatto; stranamente, da rimuovendo un parametro, confondiamo il sistema inferenza di tipo, dal momento che la 'più vicino discendente comune' di B.class
e C.class
è A.class
, ma per B.class
di per sé, è solo B.class
, che (per mancanza di covarianza a generici di Java) non corrisponde a List<Class<? extends A>>
. In questo caso, non hai scelta, ma per l'uso:
List<Class<? extends A>> list = ImmutableList.<Class<? extends A>>of(B.class);
Dal B
non effettivamente estendere A
, questo compila (e funziona) più che bene.
Spero che questa dimostrazione enfatizzi l'utilità dell'operatore.
fonte
2011-01-29 03:05:41
Per mia stessa curiosità: è necessario dichiararlo esplicitamente perché questi metodi sono statici? – christophmccann
@Christopher: no. Funziona sia con metodi statici che non statici. –
Deve essere specificato esplicitamente perché è statico, quindi non esiste un costruttore che abbia corretto gli argomenti di tipo Generico e poiché gli argomenti di tipo Generico non possono essere desunti dall'elenco dei parametri. –