这是我写的一个简短的程序:
public class Test {
public T contents;
public Test(T item) {
contents = item;
}
public static void main(String[] args) {
Test t = new Test("hello");
System.out.println(t.contents);
}
}
尝试用javac编译它,然后用javap -verbose查看字节码.我选择了几条有趣的线条:
public java.lang.Object contents;
这应该在Test构造函数的定义之前出现.在示例代码中,它是T类型,现在它是一个Object.这是擦除.
现在,看一下主要方法:
public static void main(java.lang.String[]);
Code:
Stack=3,Locals=2,Args_size=1
0: new #3; //class Test
3: dup
4: ldc #4; //String hello
6: invokespecial #5; //Method "":(Ljava/lang/Object;)V
9: astore_1
10: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: getfield #2; //Field contents:Ljava/lang/Object;
17: checkcast #7; //class java/lang/String
20: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: return
然后我们可以在第17行看到checkcast命令,就在println之前 – 这是Java从Object转换为擦除的泛型类型的字符串 – String