获取超级接口的类型参数

时间:2012-11-13 11:00:34

标签: java generics

我有:

interface I<T> {}

interface I1 extends I<Clazz1> {}

我还有I2,I3等,它扩展了I&lt; Clazz2&gt;,I&lt; Clazz3&gt;等

我不知道运行时的Clazz1。我怎么能得到这些信息?

我试过了:

subInterface1.getInterfaces()[0].getTypeParameters()[0]

但只知道T,而不是Clazz1。

2 个答案:

答案 0 :(得分:2)

当你这样做时

subInterface1.getInterfaces()[0].getTypeParameters()[0]

您将获得表示接口Class的{​​{1}}对象的第一个正式类型参数,它实际上是变量I。相反,你需要使用

T

获取subInterface1.getGenericInterfaces()[0] 对象,表示已由Type扩展的I特定实例化。这将是I1的一个实例,因此您可以转换为该实例,然后使用ParameterizedTypegetRawType()来提取原始类型getActualTypeArguments()实际分别为类型参数值I。请注意,Clazz1的返回类型是getActualTypeArguments()而不是Type[],因为实际参数可能不是具体类,它们可能是变量或通配符(或者实际上是其他参数化类型,在一个案例中)例如Class[])。

答案 1 :(得分:1)

我找到了解决方案:

((ParameterizedType)subInterface1.getGenericInterfaces()[0]).getActualTypeArguments()[0]