Ich muss gestehen, mit den Templates von Java bin ich noch nicht komplett durchgestiegen. Hier mal ein aktuelles Beispiel, wo mir nicht ganz klar ist, was der Fehler ist:
Ich hab den Ausschnitt mal aufs Wesentliche reduziert, ich hoffe es ist noch verständlich genug. Im Prinzip soll mir die create-Funktion mittels Reflection Properties aus einem Objekt ziehen und sie mir in einer Containerklasse zurückgeben.
Die Fehlermeldung in der Zeile mit getClass lautet:
Was mir da nicht ganz klar ist: Warum gibt mir ein T.getClass() ein
Wenn ich für T beispielsweise eine Referenz vom Typ "Number" übergebe, kann das Objekt ja z.B. ein java.lang.Integer sein, aber niemals ein String oder irgendetwas anderes, das von java.lang.Object ableitet. Also müsste meinem Verständnis nach das Ergebnis von getClass immer mindestens ein "Class<T>" sein, und nicht eine Class von jeder beliebigen Klasse.
Oder kann Java aufgrund der Typlöschung einfach nicht mehr ermitteln, was T jetzt genau sein soll?
Die offentsichtliche Lösung wäre natürlich, einfach den Cast auszuführen, den ich in dem Quellcodeausschnitt auskommentiert habe, und die Warnung die ich dadurch bekomme mittels
Vielleicht kennt ja von euch jemand einen besseren Weg?
Java:
public static <T> ClassPropertiesContainer<? extends T> create(@NotNull T object) {
Class<? extends T> clazz = /*(Class<? extends T>)*/ object.getClass();
// ....
}
Ich hab den Ausschnitt mal aufs Wesentliche reduziert, ich hoffe es ist noch verständlich genug. Im Prinzip soll mir die create-Funktion mittels Reflection Properties aus einem Objekt ziehen und sie mir in einer Containerklasse zurückgeben.
Die Fehlermeldung in der Zeile mit getClass lautet:
Error37, 84) java: incompatible types: java.lang.Class<capture#1 of ? extends java.lang.Object> cannot be converted to java.lang.Class<? extends T>
Was mir da nicht ganz klar ist: Warum gibt mir ein T.getClass() ein
Class<? extends Object>
zurück, und kein Class<? extends T>
?Wenn ich für T beispielsweise eine Referenz vom Typ "Number" übergebe, kann das Objekt ja z.B. ein java.lang.Integer sein, aber niemals ein String oder irgendetwas anderes, das von java.lang.Object ableitet. Also müsste meinem Verständnis nach das Ergebnis von getClass immer mindestens ein "Class<T>" sein, und nicht eine Class von jeder beliebigen Klasse.
Oder kann Java aufgrund der Typlöschung einfach nicht mehr ermitteln, was T jetzt genau sein soll?
Die offentsichtliche Lösung wäre natürlich, einfach den Cast auszuführen, den ich in dem Quellcodeausschnitt auskommentiert habe, und die Warnung die ich dadurch bekomme mittels
@SupressWarnings("unchecked")
ausblenden. Mittlerweile hab ich allerdings schon so viele unchecked-Warnungen unterdrückt, daß ich mich frage ob das wirklich der beste Weg ist.Vielleicht kennt ja von euch jemand einen besseren Weg?