Stellen Sie sich vor, Sie haben eine abstrakte Oberklasse, die generisch ist:
public abstract class Foo<? extends T> {}
Und dann haben Sie eine zweite Klasse, die Foo mit einem generischen Balken erweitert, der T erweitert:
public class Second extends Foo<Bar> {}
Sie können die Klasse Bar.class
in der Foo-Klasse erhalten, indem Sie die Type
(aus der Antwort von bert bruynooghe) auswählen und mithilfe der folgenden Class
Instanz ableiten :
Type mySuperclass = myFoo.getClass().getGenericSuperclass();
Type tType = ((ParameterizedType)mySuperclass).getActualTypeArguments()[0];
//Parse it as String
String className = tType.toString().split(" ")[1];
Class clazz = Class.forName(className);
Sie müssen beachten, dass diese Operation nicht ideal ist. Daher empfiehlt es sich, den berechneten Wert zwischenzuspeichern, um Mehrfachberechnungen zu vermeiden. Eine der typischen Anwendungen ist die generische DAO-Implementierung.
Die endgültige Implementierung:
public abstract class Foo<T> {
private Class<T> inferedClass;
public Class<T> getGenericClass(){
if(inferedClass == null){
Type mySuperclass = getClass().getGenericSuperclass();
Type tType = ((ParameterizedType)mySuperclass).getActualTypeArguments()[0];
String className = tType.toString().split(" ")[1];
inferedClass = Class.forName(className);
}
return inferedClass;
}
}
Der zurückgegebene Wert ist Bar.class, wenn er von der Foo-Klasse in einer anderen Funktion oder von der Bar-Klasse aufgerufen wird.