0

我有以下类结构:

class A<T,R> {
   B<R> b;
......
}

class B<R> {
   R t;
}

class StringConsumer {
   A<String, String> a;
}

class LongConsumer {
   A<Long, Long> a;
}

鉴于我有一个消费者类的实例,是否可以获得类型参数consumer.a.b?我发现如果我声明aStringA a;where class StringA extends A<String, String>using TypeTools ,我可以解决同样的问题

4

1 回答 1

1

由于您的使用者类声明了a没有类型变量的字段,因此您需要的所有类型信息都将在运行时出现。

虽然可以直接使用反射来实现您的要求,但它会很快变得疯狂,因此我强烈建议使用GenTyRefGeAnTyRef(我维护的增强型分支)。

StringConsumer consumer = new StringConsumer(); //Or LongConsumer

Field a = consumer.getClass().getDeclaredField("a");
//typeOfA represents A<String, String>
ParameterizedType typeOfA = (ParameterizedType) GenericTypeReflector.getExactFieldType(a, consumer.getClass());

Type[] args =  typeOfA.getActualTypeArguments();
System.out.println(args[0]); //String
System.out.println(args[1]); //String

Field b = A.class.getDeclaredField("b");
//or if you need it dynamic ((Class)typeOfA.getRawType()).getDeclaredField("b")
//or GenericTypeReflector.erase(typeOfA).getDeclaredField("b")
//typeOfB represents B<String>
ParameterizedType typeOfB = (ParameterizedType) GenericTypeReflector.getExactFieldType(b, typeOfA);
System.out.println(typeOfB.getActualTypeArguments()[0]); //String again

所以你在这里做的是从 开始StringConsumer,获取其字段的类型atypeOfA,即A<String, String>),然后使用该信息获取字段的类型btypeOfB,即B<String>)。您可以通过这种方式尽可能深入...

于 2019-06-03T14:31:09.627 回答