2015-02-25 4 views
0

Я использую Java 7. При попытке извлечь фактические общие параметры производного класса, я использую следующий код:Java получить фактические общие параметры

Class<E> cls = (Class<E>) ((ParameterizedType) 
        getClass().getGenericSuperclass()) 
          .getActualTypeArguments()[0]; 

Это, как правило, работает хорошо, но если у меня есть случай множественного наследования (C расширяет B расширяет A), а B также является абстрактным (еще не объявляющим фактические общие параметры). Я рекурсивно получаю класс перед базовым (B) и использую этот метод в B (вместо getClass()) [поскольку, если бы я использовал его на C, его суперкласс не был параметризованным типом], а фактические аргументы типа показывают мне общие типы (я получаю T для использования этого).

Если кто-нибудь столкнулся с этим, я был бы признателен за любую помощь или рекомендации.

+0

Почему вы пытаетесь извлечь фактические общие параметры производного класса? – immibis

+0

Обратите внимание, что 'C extends B extends A' не является множественным наследованием, которое является 'C extends B и A' – Thirler

+0

Да, это не множественное наследование (которое не существует в java 7), поэтому я добавил объяснение в скобках , Весь мой случай - это базовый класс, из которого производятся многие классы. Я хочу сделать действие с фактическим общим во всех этих классах .. но некоторые классы не производятся непосредственно из этого класса (есть этот класс B в середине) в этом случае извлечение фактического параметра возвращает Т вместо фактических параметров. – user3476452

ответ

0

Чтобы разрешить аргументы типа с множественным наследованием, лучше всего использовать что-то вроде TypeTools.

class A<T> {} 
class B<T> extends A<T> {} 
class C extends B<String> {} 

// Resolve the type argument for A using type information from C 
Class<?> t = TypeResolver.resolveRawArgument(A.class, C.class); 
assert t == String.class; 
+0

Большое спасибо! Это то, что я искал. – user3476452

0

Ваша проблема может заключаться в том, что дженерики являются инвариантными. Как вы говорите, это, как правило, работает хорошо, но прийти наследование - вы в беде ...
Для любых двух различных типов А и В, Class<A> не является ни подтипом, ни супертипом Class<B> [JLS, 4,10].

+0

Да, но класс B расширяет класс A , и я хочу найти его по методу в A. Этот случай работает, но если есть C extends A и выше B продолжается C, он не работает. – user3476452

+0

Могу ли я предложить некоторое дополнение кода для целей тестирования, которое облегчит вам процесс отладки в этом случае. Цепочка .getClass(). GetGenericSuperclass() дважды подряд и дайте ему перейти к проблемной цепочке наследования, чтобы узнать, пройдет ли она. Это он действительно проходит, закодируйте обходное решение для длинных цепочек наследования. – Dragan

+0

Я получил getSuperclass.getGenericSuperclass, и он получил меня T, который является общим объявлением в C, вот где моя проблема, я сделал цикл получения супер-классов, пока не достигнет того, который мне нужен именно так. И я не как представляется, получить фактический общий этот путь. Похоже, он работает только с прямыми подтипами ... – user3476452

Смежные вопросы