调用Method.getParameterTypes()时获取意外的参数类型

时间:2011-08-20 02:12:02

标签: java generics reflection

我有以下类层次结构:

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> {}

现在,如果我运行它(irpIntegerRangeParameter的实例):

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

如果我在调试器上执行此代码并评估parameterTypes我得到[interface java.lang.Comparable],但我原以为它是BigInteger ...

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

由于需要向后兼容,您遇到了使用Java泛型时固有的Type Erasure问题。通用参数主要用于编译时类型检查,并且在运行时信息丢失(大部分)。请查看提供的链接以获取更多信息。

编辑1
另请查看类似的SO主题:get-type-of-a-generic-parameter-in-java-with-reflection