Правильный способ получить типовой аргумент - PullRequest
0 голосов
/ 18 декабря 2011

Следующий код получает первый класс параметров типа, объявленный в общем виде в интерфейсе SomeGenericInterface, который конкретно реализуется в классе SomeClass.

Этот код действительно работает.

Вопросis: Работает ли оно в любом случае, то есть следующие два метода класса:

  • 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 ]

2 голосов
/ 18 декабря 2011

Состояние javadoc для обоих методов:

Если этот объект представляет класс, возвращаемое значение представляет собой массив, содержащий объекты, представляющие все интерфейсы, реализованные классом.Порядок объектов интерфейса в массиве соответствует порядку имен интерфейсов в разделе Implements объявления класса, представленного этим объектом.

, поэтому ответ на оба ваших вопроса - да, одинаковое количество элементов и в том же порядке.

0 голосов
/ 19 декабря 2011

Работает ли это в любом случае

Нет, но не по причинам, которые вы подозреваете.Он будет работать только в том случае, если класс реализует интерфейс напрямую (в отличие от наследования интерфейса от суперкласса) и указывает конкретный тип для параметра типа (в отличие от использования параметра типа, как в следующем примере).

class CounterExample<T> implements Interface<T> {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...