我在阅读Thinking in java,Generics.在一个例子中(在"边界的行动"段落)
public class GenericHolder<T> {
private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }
public static void main(String[] args) {
GenericHolder<String> holder =
new GenericHolder<String>();
holder.set("Item");
String s = holder.get();
}
} ///:~
public void set(java.lang.Object);
0: aload_0
1: aload_1
2: putfield #2; //Field obj:Object;
5: return
public java.lang.Object get();
0: aload_0
1: getfield #2; //Field obj:Object;
4: areturn
public static void main(java.lang.String[]);
470 Thinking in Java Bruce Eckel
0: new #3; //class GenericHolder
3: dup
4: invokespecial #4; //Method "<init>":()V
7: astore_1
8: aload_1
9: ldc #5; //String Item
11: invokevirtual #6; //Method set:(Object;)V
14: aload_1
15: invokevirtual #7; //Method get:()Object;
18: checkcast #8; //class java/lang/String
21: astore_2
22: return
Run Code Online (Sandbox Code Playgroud)
根据反汇编代码行18,编译器添加校验广播代码.我想知道是否总是对通用的这种checkcast.我将String替换为Integer并再次尝试,但我最终没有找到checkcast代码.对象类型也是如此.
有人可以解释一下吗?是String在Java是一种特殊的对象?
我将String替换为Integer并再次尝试,但我最后没有找到checkcast代码.
对我来说,它产生checkcast也为Integer:
0: new #3; //class GenericHolder
3: dup
4: invokespecial #4; //Method GenericHolder."<init>":()V
7: astore_1
8: aload_1
9: iconst_5
10: invokestatic #5; //Method java/lang/Integer.valueOf:(I)
13: invokevirtual #6; //Method GenericHolder.set:(Ljava/lang/Object;)V
16: aload_1
17: invokevirtual #7; //Method GenericHolder.get:()Ljava/lang/Object;
20: checkcast #8; //class java/lang/Integer
23: astore_2
24: return
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该get方法具有签名,Ljava/lang/Object;即checkcast确保Object返回的确是一个Integer.
编辑:在您发布的代码中作为评论:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: new #3; //class b/TestG
6: dup
7: new #4; //class java/lang/Integer
10: dup
11: iconst_2
12: invokespecial #5; //Method java/lang/Integer."<init>":(I)V
15: invokespecial #6; //Method b/TestG."<init>":(Ljava/lang/Object;)V
18: invokevirtual #7; //Method b/TestG.getT:()Ljava/lang/Object;
21: invokevirtual #8; //Method java/io/PrintStream.print:(Ljava/lang/Objec t;)V
24: return
Run Code Online (Sandbox Code Playgroud)
传递PrintStream.print接受的返回值Object.因此,不需要转换返回的值.(checkcast java.lang.Object总是会经历!)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |