获得泛型类型参数的正确方法

时间:2011-12-18 17:31:03

标签: java generics interface generic-type-argument

以下代码获取在接口SomeGenericInterface中一般声明的第一个类型参数类,该类在类SomeClass中具体实现。

此代码确实有效。

问题是:它是否在任何情况下都有效,即以下两种类方法:

  • getInterfaces()
  • getGenericInterfaces()

保证始终具有相同数量的元素,并且这些方法返回的接口的顺序相同?

或者有更安全的方法吗?

<!-- language: lang-java -->

Class clazz = SomeClass.class;

Class classes[] = clazz.getInterfaces();
Type types[] = clazz.getGenericInterfaces();
ParameterizedType found = null;

for (int i=0; i<classes.length; i++) {
   if (  classes[i] == SomeGenericInterface.class) {
      found = (ParameterizedType) types[i];
      break;
   }
}
if (found == null) {
     return null;
}
Class firstType = (Class) found.getActualTypeArguments()[0];

2 个答案:

答案 0 :(得分:2)

两种方法的javadoc都说明了:

  

如果此对象表示类,则返回值为数组   包含表示由实现的所有接口的对象   类。数组中接口对象的顺序对应于   。的implements子句中接口名称的顺序   该对象所代表的类的声明。

因此,您的问题的答案是肯定的,相同数量的元素和相同的顺序。

答案 1 :(得分:0)

  

无论如何都适用

不,但不是因为你怀疑的原因。它只有在类直接实现接口时才会起作用(而不是从超类中继承接口),并为type参数指定具体类型(而不是使用类型参数,如下例所示)。 / p>

class CounterExample<T> implements Interface<T> {}