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

Powyższe zestawienie zawiera ostrzeżenie "Bezpieczeństwo typu: Niezaznaczone rzutowanie z Class<capture#5-of ?> na Class<? extends MyClass>".Czy istnieje sposób, aby rzucić klasy, aby mieć określone parametry do klasy java.lang.Class <>?

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

Tym razem pojawia się błąd, ponieważ typu skasowaniem ...

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

Tym razem wiem, że obsada jest bezpieczny, ale kompilator nie robi, i nadal daje ostrzeżenie. (Jeśli pytasz mnie, kompilator jest tutaj nieco grubszy.)

Czy istnieje sposób na uniknięcie tego ostrzeżenia (z wyjątkiem SuppressWarnings)?

+0

ty „sprawdzone” przed cast, więc nie jest to dokładnie „niezaznaczone cast”. wiesz w tym przypadku lepiej niż kompilator, więc po prostu powiedz, żeby się wyluzować :) - powiązane - http://stackoverflow.com/questions/16611053/generics-oddity-i-can-insert-a-long-value-into -a-mapstring-string-and-it-co/16612897 # 16612897 – ZhongYu

+0

Należy pamiętać, że 'Klasa' jest wyjątkowa, ponieważ reprezentuje swój własny parametr. – biziclop

+0

Więc twój ostatni fragment kodu i '@ SuppressWarnings' jest sposobem na przejście tutaj lub o jeden krok lepiej jest [to] (http://stackoverflow.com/a/30466702/574479), który robi dokładnie to samo, co twój kod robi. – biziclop

Odpowiedz

4

Prawidłowy sposób zrobić to, co chcesz:

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

Dzięki - i wystarczająco zabawnie, [źródło OpenJDK dla tej metody] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Class. java # Class.asSubclass% 28java.lang.Class% 29) używa '@ SuppressWarnings' i' isAssignableFrom', tak jak w moim trzecim fragmencie kodu powyżej. Nie wiedziałem o tym przed opublikowaniem mojego pytania. Uważam za zabawne, że generics Java jest tak zepsute, że muszą używać '@ SuppressWarnings' w swoim własnym kodzie źródłowym. – Kidburla

Powiązane problemy