我知道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
上的同一方法调用无效?
答案 0 :(得分:4)
obj
指的是实际对象(类型为String
)。在运行时,非原始对象随身携带它们的类型信息,这是getClass()
返回的。
这并非真正受到仿制药的影响(尤其是因为仿制药在运行时不存在)。这与你做过这样的事情完全一样:
Object ob = "abcd";
System.out.println(ob.getClass().getName());