Für etwas Hintergrund, ich arbeite an einigen Framework-Sachen für eine Programmiersprache, die ich entwickle (JVM-Sprache, das ist), und getestet einige der Framework mit Java-Klassen, daher all die seltsamen Wrapper unten.Erhalte generische Parameter eines generischen Typs
Also, meine Fragen ist, wie bekomme ich die Typvariablen der Grenzen eines Typparameters? Zur Zeit habe ich folgendes:
public static TemplateGenerics of(Class clazz) {
TemplateGenerics generics = new TemplateGenerics(); //TemplateGenerics is a wrapper class for generics that appear in the class header
Stream.of(clazz.getTypeParameters()).forEach(typeVariable -> {
java.lang.reflect.Type b = typeVariable.getBounds()[0];
try {
Class c = Primitives.resolveClass(b.getTypeName().split("<", 2)[0]); //Is there a better way to do this?
TemplateGenerics sub = TemplateGenerics.of(c); //Recursivley get the generics - it fails here
generics.getConditionals().add(new Conditional(new Type.Hierarchical(sub, c.getName()), Conditional.Condition.EXTENDS, typeVariable.getName())); //Conditional is another wrapper class that handles bounds of the generic,
//Type.Hierachical is yet another wrapper class that wraps types that appear in class headers
} catch (ClassNotFoundException e) {
throw new RuntimeException(e); //For testing purposes
}
});
return generics;
}
Aber das scheitert mit einem Stackoverflow, wenn es so etwas wie dies trifft:
public class A<T extends A<T>> ...
Da es nur weiter versuchen, die Parameter des Typs A über bekommen und über . Ich bin nicht in der Lage, eine Methode zu finden, um die Typvariablen der Typvariablen zu bekommen ... Ich habe versucht, mit getGenericDeclaration herumzuspielen, aber es scheint nicht das zurückzugeben, was ich brauche. Jede Hilfe wird sehr geschätzt.
Sie sollten auch berücksichtigen, Fall 'A>' und 'B >'. Um Zyklen zu vermeiden, sollten Sie bereits bearbeitete und aktuell bearbeitete Typen behalten. Wenn Sie auf einen Typ stoßen, den Sie verarbeiten, aber nicht beenden, sollten Sie einen Platzhalter verwenden und nach der Verarbeitung aller Typen Platzhalter durch korrekte Ergebnisse ersetzen. –
csharpfolk
Ja, ich habe versucht, so etwas mit einer Karte zu machen, aber ich bin immer noch nicht genau, wie ich die Informationen bekomme, die ich brauche. –