2011-08-20 2 views
1

У меня есть следующие иерархии классов:Получение неожиданного типа параметра при вызове Method.getParameterTypes()

public abstract class NumberRangeParameter<T extends Comparable<T>> 
extends ComplexParameter{ 

    private T lower; 

    public void setLower(T lower) { 
     this.lower = lower; 
    } 

} 
public class IntegerRangeParameter extends NumberRangeParameter<BigInteger> {} 

Теперь, если я запускаю это (irp является экземпляром IntegerRangeParameter):

Method[] methods = irp.getClass().getMethods(); 
for (Method m : methods) { 
    Class<?>[] parameterTypes = m.getParameterTypes(); 
} 

Если я сделаю этот код на отладчике и оцениваю parameterTypes, я получаю [interface java.lang.Comparable], но я ожидал, что это будет BigInteger ...

Может кто-нибудь объяснить, почему это происходит?

ответ

2

Вы столкнулись с проблемой Type Erasure, которая присуща при использовании Java-дженериков из-за необходимости обратной совместимости. Общие параметры в основном существуют для времени компиляции, и информация теряется (по большей части) во время выполнения. Пожалуйста, ознакомьтесь с приведенной ссылкой.

Edit 1
Также, пожалуйста, проверьте это похоже SO нить: get-type-of-a-generic-parameter-in-java-with-reflection

+0

Спасибо, я понял, что это было что-то делать с этим, Java дженериков еще озадачить меня иногда. Кстати, мне интересно, какую ошибку я получу, если я вызову метод с подклассом 'Comparable', но не' BigInteger'. – guardianpt

+0

Вероятно, вы не увидите ошибок времени компиляции (один из рисков использования отражения с помощью генериков), но, скорее всего, получите исключение класса при запуске. –

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