2

我有:

interface I<T> {}

和:

interface I1 extends I<Clazz1> {}

我还有 I2、I3 等扩展 I<Clazz2>、I<Clazz3> 等。

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

我试过:

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

但in只知道T,不知道Clazz1。

4

2 回答 2

2

当你这样做

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

您将获得Class表示接口的对象的第一个正式类型参数I,这确实是变量T。相反,您需要使用

subInterface1.getGenericInterfaces()[0]

获取表示已扩展的特定实例化Type对象。这将是 的一个实例,因此您可以转换为该实例,然后使用and分别提取原始类型和实际类型参数值。请注意,返回类型is而不是因为实际参数可能不是具体的类,它们可能是变量或通配符(或者实际上是其他参数化类型,在这种情况下,例如)。II1ParameterizedTypegetRawType()getActualTypeArguments()IClazz1getActualTypeArguments()Type[]Class[]List<List<String>>

于 2012-11-13T11:16:54.517 回答
1

我找到了解决方案:

((ParameterizedType)subInterface1.getGenericInterfaces()[0]).getActualTypeArguments()[0]
于 2012-11-13T11:19:12.803 回答