getClass()。getName()如何返回泛型类的类名?

时间:2018-04-21 10:23:25

标签: java reflection

我知道java使用类型擦除用于泛型和java文档说getClass()返回对象的运行时类,但是后面的程序打印泛型类的类名。
代码:

    public class Gen<T> {
        T ob;
        public Gen(T ob) {
            this.ob=ob;
        }
        void showType() {
            System.out.println("Type of T is "+ ob.getClass().getName());

        }

}


    public class GenDemo {

        public static void main(String[] args) {
            Gen<String> str = new Gen("abcd");
            str.showType();

        }

    }

输出:
Type of T is java.lang.String

该程序如何运作?它是如何获得不可再生类型的运行时类的?

 EDIT

    public class Gen<T> {
        T ob;
        T ob1=ob;
        public Gen(T ob) {
            this.ob=ob;
        }
        void showType() {
            System.out.println("Type of T is "+ ob.getClass().getName());

        }
        void showType1(){
            System.out.println(ob1.getClass().getName());
        }

    }
public class GenDemo {

    public static void main(String[] args) {
        Gen<String> str = new Gen("abcd");
        str.showType();
        str.showType1();

    }

}



output:

Exception in thread "main" java.lang.NullPointerException
        at Gen.showType1(Gen.java:13)
        at GenDemo.main(GenDemo.java:7)

为什么ob1上的同一方法调用无效?

1 个答案:

答案 0 :(得分:4)

obj指的是实际对象(类型为String)。在运行时,非原始对象随身携带它们的类型信息,这是getClass()返回的。

这并非真正受到仿制药的影响(尤其是因为仿制药在运行时不存在)。这与你做过这样的事情完全一样:

Object ob = "abcd";
System.out.println(ob.getClass().getName());