如何获得超级超级接口的参数化类型的实际类型?

时间:2016-11-30 09:10:50

标签: java generics

请注意:此处的示例基于InvocationHandler实例,实际上是来自MapperProxy

mybatis-3实例

像这样:

public interface A<T1,T2> {}
public interface B<T4,T3> extends A<T3,T4> {}
public class C implements B<Long, String> {}

如何检索界面T2的{​​{1}}的实际类型?

A

只返回((ParameterizedType)((Class)((ParameterizedType)((Class)this.getClass() .getGenericInterfaces()[0]).getGenericInterfaces()[0]).getRawType()) .getGenericInterfaces()[0]).getActualTypeArguments()` ,但[P,E]是我真正想要检索的内容。

当然,我们可以从这里获得实际的参数化类型:

[String, Long]

我可以在这里获得((ParameterizedType)((Class)this.getClass().getGenericInterfaces()[0]) .getGenericInterfaces()[0]).getActualTypeArguments()

但是如果[Long, String]的参数化类型有不同的序列,而我真的不知道区别是什么,我怎样才能得到B的实际类型?

1 个答案:

答案 0 :(得分:0)

好的,经过长时间的思考和测试,这个问题的解决方案即将来临。

此解决方案最重要的一点是 B的类型参数将作为A

的类型参数传递

有几个关键点可以解决这个问题:

  1. 缓存B的类型参数和类型参数的类型映射;
  2. 尝试获取A的类型参数;
  3. 根据A的类型参数检索实际类型参数;
  4. 前一个例子的细节:

    1. B.class.getTypeParameters() =&gt; [T4,T3]
    2. B.class.getActualTypeArguments() =&gt; [Long,String]
    3. A.class.getTypeParameters() =&gt; [T1,T2]
    4. A.class.getActualTypeArguments() =&gt; [T3,T4]
    5. A.parameterizedType[T1]&lt; = B.typeArguments[T3]&lt; = String
    6. 在反复执行此操作后,可以正确获取实际类型参数。