2016-06-10 18 views
0

Wenn ich diese Funktion schreiben:Rückgabe eine spezielle Implementierung einer generischen Schnittstelle von einer generischen Funktion ohne „ungeprüft“ Warnung

static <T> T getDefaultValue(Class<T> tClass) { 
    if(tClass == Integer.class) // or isAssignableFrom 
     return (T)Integer.valueOf(0); 
    ... 
} 

Ich erhalte die Warnung Type safety: Unchecked cast from Integer to T, weil Generika gelöscht werden. Ich kann es umgehen, indem Class.cast mit:

static <T> T getDefaultValue(Class<T> tClass) { 
    if(tClass == Integer.class) 
     return tClass.cast(Integer.valueOf(0)); 
    ... 
} 

Aber ich kann nicht einen Weg finden, einen generischen Typen auf die Funktion der generischen Argument zurück:

interface Thing<T> {...} 
class ThingForInteger implements Thing<Integer> {...} 
static <T> Thing<T> getThing(Class<T> tClass) { 
    if(tClass == Integer.class) 
     return [what?](new ThingForInteger()); 
    ... 
} 

Gibt es eine Möglichkeit, dies zu tun , außer der Besetzung, die die Warnung verursacht?

(Außerdem gibt es eine Möglichkeit, eine Map<Class<?>, Thing<[class from key]>> und bekommen Implementierungen daraus zu machen, ohne die Warnung zu unterdrücken zu müssen?)

+0

Beide sind unmöglich. Generische Typisierung wird zur Laufzeit gelöscht, daher gibt es keine 'List .class', zum Beispiel nur' List.class'. – VGR

+0

@VGR Ich frage nach einer Möglichkeit, die Informationen zum Zeitpunkt der Kompilierung so zur Verfügung zu stellen, dass der Compiler keine Warnung gibt. Das bedeutet nicht unbedingt eine 'Thing .class'. [Wirklich, der Compiler _sollte_ schlau genug sein, die Warnung trotzdem nicht zu geben, da die Rückkehranweisung durch eine Bedingung geschützt wird, die eine Klasse erfordert, um einer Klasse gleich zu sein] – Random832

Antwort

0

AFAIK, das ist genug, um keine Warnungen zu haben:

static <T> Thing<T> getThing(Class<T> tClass) { 
    if (tClass == Integer.class) { 
     return (Thing) new ThingForInteger(); 
    } 
    ... 
Verwandte Themen