2013-10-30 13 views
5

mam statyczną metodę, która będzie zwracać typ niestandardowy w oparciu o typ klasy,Jak zdobyć klasy <?> przedmiot ogólnego typu

public class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
     return null; 
    } 

} 

Teraz chcę przejść klasę z ogólnym wpisz go,

CustomType<String> type = GenericMethod.returnGeneric(CustomType.class); 

Jedynym problemem jest to, że powyższa instrukcja zawiera i odznacza ostrzeżenie o konwersji.

Próbowałem obejścia problemu new CustomType<String>().getName(), który również nie rozwiązuje problemu.

Czy jest to właściwa droga, czy jedynym rozwiązaniem jest użycie @SuppressWarnings?

+1

możliwe duplikat: http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? – benzonico

Odpowiedz

1

Co byś/chciałbym spróbować to:

CustomType<String> type = GenericMethod.returnGeneric(CustomType<String>.class); 

Niestety, ze względu na typ skasowaniem nie ma różnicy między CustomType<A>.class i CustomType<B>.class, stąd ta składnia nie jest obsługiwana przez Java.

więc moja $ .02: co prosisz, nie jest to możliwe, więc trzymaj się z @suppresswarnings ...

+0

Spróbuj go skompilować. –

+0

Dlaczego, jak powiedziałem: "stąd ta składnia nie jest obsługiwana przez Javę" – GerritCap

+0

Została zmieniona odpowiedź, a następnie wpisano poprawny komentarz. –

1

Najlepszym rozwiązaniem jest użycie metody opakowania i umieścić wszystkie swoje ostrzeżenia w pojedynczym miejsce.

Określenie "niezaznaczony" oznacza, że ​​kompilator nie ma wystarczającej ilości informacji o typie, aby wykonać wszystkie kontrole typu niezbędne do zapewnienia bezpieczeństwa typu.

0

Teoretycznie nie można tego zrobić ze względu na wymazanie typu.

W praktyce jednak;) można to zrobić, ponieważ informacje znajdują się w plikach .class. Najłatwiejszy sposób, jaki znam, to using Spring's GenericTypeResolver.

Spójrz na to.

+0

Nie ma różnicy między teorią a praktyką. Nie rozumiesz, czym jest wymazywanie typu. Metadane klasy nie mają związku z tym pytaniem. – newacct

0

Jak już powiedziałeś @Simeon "Teoretycznie nie możesz tego zrobić z powodu typu wymazania". Można go używać tylko wtedy, gdy masz podklasy CustomType:

class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return null; 
    } 

    public static void main(String [] args){ 
    CustomeType<String> ct = returnGeneric(StringCustomeType.class); 
    System.out.println(ct); 
    } 
} 

class StringCustomeType extends CustomeType<String> { 
} 

class CustomeType<T> { 
} 
Powiązane problemy