私はThinking in java、Genericsを読んでいます。逆アセンブルコード線18によれば、一例では(段落「境界で動作」で)Javaジェネリックで実行時にString型の戻り値のみがチェックされるのはなぜですか?
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
、コンパイラはcheckcastコードを付加します。私はジェネリックのために常にこのようなチェックキャストになるかどうかを知りたい。 StringをIntegerに置き換えてもう一度やり直しましたが、最後にチェックキャストコードが見つかりませんでした。 Object型も同様です。
誰かがそれを説明できますか? JavaのString
は特別なオブジェクトですか?
オブジェクトの場合、オブジェクトにキャストすることができるので、キャストは必要ありません。 –