【问题标题】:Why does reflection work when used in a generic method?为什么在泛型方法中使用反射会起作用?
【发布时间】:2016-08-20 16:26:05
【问题描述】:

我读到 Java 中的泛型是使用类型擦除实现的。 我想测试一下,看看我是否完全理解了这个概念,但当我发现这段代码完美运行时,我感到惊讶和困惑:

public class Test{
    public static void main(String []args){
        canAssign3(3,3.2);
    }

    static<T1,T2> boolean canAssign3(T1 from, T2 to){
        Class<?> c1 = from.getClass();
        Class<?> c2 = to.getClass();
        System.out.println(c1.getName());
        System.out.println(c2.getName());
        System.out.println(c2.isAssignableFrom(c1));
        return (c2.isAssignableFrom(c1) );
    }
}

输出:

java.lang.Integer
java.lang.Double
false 

我期待c1 的班级和c2 的班级是Object,还有c2.isAssignableFrom(c1)true。 我在这里错过了什么?

【问题讨论】:

  • 类型擦除发生在编译时。

标签: java generics reflection type-erasure


【解决方案1】:

无论是否通用,每个对象都有一个类,它是您正在调用的那个类的方法。

如果两个参数都是Object 类型,此方法将同样有效。事实上,使它们成为泛型并没有增加任何价值,因为您没有使用泛型类型。

【讨论】:

  • 谢谢!那么是否存在由于使用泛型而导致反射无法工作的情况?
  • Reflection 早于泛型。反射不使用泛型并且不受影响。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
相关资源
最近更新 更多