Как проверить тип возвращаемого объекта "multi-object" - PullRequest
1 голос
/ 06 марта 2011

Есть ли общий подход к отражению, чтобы выяснить, возвращает ли java-метод набор объектов, таких как массив, список, набор, коллекция и другие итерируемые подынтерфейсы? Дело в том, что мне нужно проверить тип возвращаемого значения стороннего метода и сказать две вещи:

  • Возвращает ли метод набор объектов (в человеческий смысл)?
  • Если да - какой тип компонента?

Например, если тип возвращаемого метода - Vector<A>, A[], Set<A> и т. Д., Я хочу, чтобы мой код возвращал A. Я новичок в рефлексии / дженериках, не хочу изобретать велосипед и не уверен, что мой подход правильный. Вот что я сделал до сих пор:

  private boolean isMultiple(Class clazz) {
    return clazz.isArray() || Iterable.class.isAssignableFrom(clazz);
  }

  private Class getReturnComponentType(Method m) {
    Class clazz = m.getReturnType();
    if(!isMultiple(clazz)) return clazz; // Not a collection
    // Collection
    if(clazz.isArray()) {
      // How do I get Array's component type?
      // return null;
    } else {
      // How do I get Iterable component type?
      // return null;
    }
  }

Пожалуйста, помогите.

1 Ответ

2 голосов
/ 06 марта 2011
  1. Чтобы получить тип компонента Iterable: помимо getReturnType() также используйте getGenericReturnType() для получения универсальных типов. Затем сравните его с Type подинтерфейсами: GenericArrayType, ParameterizedType.

  2. Чтобы получить тип компонента Array, используйте clazz.getComponentType().

...