Es sollte beachtet werden, dass während Java Generic zur Laufzeit gelöscht wurde, es begrenzte Reflektionsapis gibt, um sie abzurufen, wenn sie in der Klassendatei vorhanden sind.
Hier ist eine schnelle Lösung mit dieser Annahme:
AbstractTestLoader
die direkte Superklasse ist.
- Unterklassen verwenden keinen Wildcardtyp, wenn eine Superklasse deklariert wird, z. Sub-Klassen wie diese
class GenericLoader<T extends SubclassAbstractEntity<T>> extends AbstractTestLoader<T>
existiert nicht. Hier
ist der Code:
public class AbstractTestLoader<T extends AbstractEntity<T>> {
private static final ClassValue<Class<?>> TYPE_PARAMETER_CACHE = new ClassValue<Class<?>>() {
@Override
protected Class<?> computeValue(Class<?> type) {
assert AbstractTestLoader.class.isAssignableFrom(type);
assert type.getSuperclass() == AbstractTestLoader.class;
Type genericSuperclass = type.getGenericSuperclass();
assert genericSuperclass instanceof ParameterizedType;
Type entityType = ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
assert entityType instanceof Class<?>;
return (Class<?>) entityType;
}
};
@SuppressWarnings("unchecked")
protected Class<T> getEntityType() {
return (Class<T>) TYPE_PARAMETER_CACHE.get(this.getClass());
}
public void onMessage(Object message) throws Exception {
onMessage(message, getEntityType()); // getting compile time error here
}
public void onMessage(Object message, Class<T> clazz) throws Exception {
//here my original logic will go
}
}
Die getEntityType
kann in Unterklassen außer Kraft gesetzt werden, in denen diese beiden Annahmen scheitern.
Warum fühlst du * so? Vielleicht möchten Sie Ihr Verständnis des zugrunde liegenden Problems hinzufügen, um sicherzustellen, dass alle auf der gleichen Seite sind. Da wir uns beim Erkunden des Lösungsraums auf die Ursache einigen müssen. – GhostCat
Hallo @GhostCat, ich habe bereits versucht, mein zugrunde liegendes Problem mit der Kommentarzeile zu erkunden 'Ich möchte diese Zeile so korrigieren, dass ich unten Methode mit der tatsächlichen Klasse von {T extends abstractEntity} aufrufen kann, auch Sie können Verweisen Sie auf die von mir gepostete Lösung, um eine bessere Lösung zu finden, wenn Sie antworten möchten. –
Wird 'AbstractTestLoader' die direkte Superklasse? – glee8e