2015-05-26 8 views
5
Class<? extends MyClass> cls = (Class<? extends MyClass>) Class.forName(className); 
someMethod(cls); // someMethod expects a Class<? extends MyClass> 

L'istruzione precedente fornisce un avviso "Tipo di sicurezza: cast non controllato da Class<capture#5-of ?> a Class<? extends MyClass>".C'è un modo per trasmettere una classe per avere parametri specifici per il java.lang.Class <> generico?

Class<?> cls0 = Class.forName(className); 
if (cls0 instanceof Class<? extends MyClass>) { 
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0; 
    someMethod(cls); 
} 

Questa volta ottengo un errore, a causa della cancellazione di tipo ...

Class<?> cls0 = Class.forName(className); 
if (MyClass.class.isAssignableFrom(cls0)) { 
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0; 
    someMethod(cls); 
} 

Questa volta ho so che il cast è sicuro, ma il compilatore non lo fa, e ancora dà L'avviso. (Se mi chiedi, il compilatore è un po 'spesso qui.)

C'è un modo per evitare questo avviso (ad eccezione di SuppressWarnings)?

+0

voi "controllato" prima di lanci, quindi non è esattamente "getto incontrollato". lo sai meglio del compilatore in questo caso, quindi dillo e basta :) - related - http://stackoverflow.com/questions/16611053/generics-oddity-i-can-insert-a-long-value-into -a-mapstring-string-and-it-co/16612897 # 16612897 – ZhongYu

+0

La cosa importante da ricordare è che 'Class' è speciale in quanto rappresenta il proprio parametro di tipo. – biziclop

+0

Quindi il tuo ultimo frammento di codice e '@ SuppressWarnings' è il modo per andare qui o un passo migliore è [questo] (http://stackoverflow.com/a/30466702/574479), che fa esattamente la stessa cosa che il tuo codice lo fa. – biziclop

risposta

4

Il modo corretto di fare quello che vuoi è:

Class.forName(className).asSubclass(MyClass.class); 
+0

Grazie - e stranamente, il [fonte OpenJDK per questo metodo] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Class. java # Class.asSubclass% 28java.lang.Class% 29) usa '@ SuppressWarnings' e' isAssignableFrom' proprio come nel mio terzo snippet di codice sopra. Non lo sapevo prima di pubblicare la mia domanda. Trovo esilarante il fatto che i generici di Java siano così guasti da dover utilizzare '@ SuppressWarnings' nel proprio codice sorgente. – Kidburla

Problemi correlati