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?)
Beide sind unmöglich. Generische Typisierung wird zur Laufzeit gelöscht, daher gibt es keine 'List .class', zum Beispiel nur' List.class'. –
VGR
@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