Questa linea non può essere compilato:
test(E1.class,E2.class);
C'è un solo tipo di parametro E
, e Java deve corrispondere ai tipi dedotto di argomenti esattamente. Non può dedurre Example
, perché gli oggetti sono Class<E1>
e Class<E2>
, non Class<Example>
. L'invarianza dei generici Java impedisce che ciò accada.
È possibile aggirare il problema introducendo un jolly limite superiore parametro di tipo generico test
s':
public static <E extends Example> void test(Class<? extends E>... es)
Questo permette Java per inferire Example
per E
, soddisfacendo il carattere jolly limite superiore con E1
e E2
.
La seconda riga crea una matrice raw di Class
es, ignorando i generici e generando un avviso di "chiamata non verificata".
new Class[]{E1.class,E2.class}
Se si dovesse tentare di fornire un argomento di tipo a Class
qui, si otterrebbe un errore di compilazione con qualsiasi parametro di tipo ragionevole a metà strada:
// Needs Class<Example> but found Class<E1> and Class<E2>
test(new Class<Example>[]{E1.class,E2.class});
// Needs Class<E1> but found Class<E2>
test(new Class<E1>[]{E1.class,E2.class});
// Needs Class<E2> but found Class<E1>
test(new Class<E2>[]{E1.class,E2.class});
Soddisfare l'inferenza utilizzando un carattere jolly qui scopre solo il vero problema qui: la creazione di array generici.
// Generic array creation
test(new Class<? extends Example>[]{E1.class,E2.class});
Grazie mille. Non è mai stato dannoso per il mio programma, ma mi sono sicuramente grattato la testa per un po '. Apprezzo molto il chiarimento. – Squirvin