Pour quelques raisons, je suis en train de développer des frameworks pour un langage de programmation que je suis en train de développer (langage JVM) et je testais une partie du framework avec des classes Java, donc tous les wrappers bizarres ci-dessous. Donc, mes questions sont: comment obtenir les variables de type des limites d'un paramètre de type? Actuellement, je donne les résultats suivants:Obtention des paramètres génériques d'un type générique
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;
}
Mais cette tentative échoue avec un StackOverflowException lorsqu'il rencontre quelque chose comme ceci:
public class A<T extends A<T>> ...
Comme il continue à essayer d'obtenir les paramètres de type A plusieurs reprises . J'ai été incapable de trouver une méthode pour obtenir les variables de type de la variable type ... J'ai essayé de jouer avec getGenericDeclaration, mais il ne semble pas retourner ce dont j'ai besoin. Toute aide est grandement appréciée.
Vous devez également prendre en compte le cas 'A>' et 'B >'. Généralement, pour éviter les cycles, vous devez conserver les types déjà traités et actuellement traités. Si vous rencontrez un type que vous commencez à traiter mais ne terminez pas, vous devez utiliser un espace réservé et après avoir traité tous les types, vous devez remplacer les espaces réservés par des résultats corrects –
csharpfolk
Oui, j'ai essayé de faire quelque chose avec une carte, mais je suis toujours Je ne sais pas exactement comment obtenir l'information dont j'ai besoin. –