バックグラウンドについては、私が開発しているプログラミング言語(つまりJVM言語)のフレームワークに取り組んでおり、Javaクラスでフレームワークをテストしていました。下のすべての奇妙なラッパー。ジェネリック型のジェネリックパラメータを取得する
私の質問は、どうやって型パラメータの境界の型変数を得るのですか?現在、私は次があります。
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;
}
しかし、それはこのようなものに遭遇したとき、このでStackOverflowExceptionで失敗します。
public class A<T extends A<T>> ...
それだけで何度もの型パラメータを取得しようとし続けているので。私は、型変数の型変数を取得する方法を見つけることができませんでした...私はgetGenericDeclarationを使いこなそうとしましたが、必要なものを返さないようです。どんな助けでも大歓迎です。
'A>'と 'B >'も考慮する必要があります。一般に、サイクルを避けるためには、すでに処理されたタイプと現在処理さ処理を開始するが、終了しないタイプに遭遇した場合は、いくつかのプレースホルダを使用する必要があります。そして、すべてのタイプを処理した後、適切な結果でプレースホルダを置き換えてください。 –
csharpfolk
ええ、私はマップでそのようなことを試みました。私が必要とする情報をどのように入手するのか正確にはわかりません。 –