Java VMと戯れてみる
J2SE 5.0の新機能
wikipedia:Java仮想マシン
言語仕様の限界にチャレンジする前に,言語使用と仲の悪くない実装を考えないと.
…ということで,とりあえずテスト.
public class CastTest<E> { public Object i; public CastTest(E i) { this.i = i; } public void setI(E i) { this.i = i; } @SuppressWarnings("unchecked") public E getI() { return (E)i; } public static void main(String[] args) { Integer i0 = Integer.valueOf(1); Integer i1 = Integer.valueOf(100); Integer i2 = Integer.valueOf(10000); Integer i3 = Integer.valueOf(10000000); CastTest ct = new CastTest<Integer>(i0); System.out.println(ct.i); System.out.println(ct.getI()); } }
で,これをjavacしてjavap -c.
Compiled from "CastTest.java" public class CastTest extends java.lang.Object{ public java.lang.Object i; public CastTest(java.lang.Object); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: aload_1 6: putfield #2; //Field i:Ljava/lang/Object; 9: return public void setI(java.lang.Object); Code: 0: aload_0 1: aload_1 2: putfield #2; //Field i:Ljava/lang/Object; 5: return public java.lang.Object getI(); Code: 0: aload_0 1: getfield #2; //Field i:Ljava/lang/Object; 4: areturn public static void main(java.lang.String[]); Code: 0: iconst_1 1: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: astore_1 5: bipush 100 7: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 10: astore_2 11: sipush 10000 14: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 17: astore_3 18: ldc #4; //int 10000000 20: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 23: astore 4 25: new #5; //class CastTest 28: dup 29: aload_1 30: invokespecial #6; //Method "<init>":(Ljava/lang/Object;)V 33: astore 5 35: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream; 38: aload 5 40: getfield #2; //Field i:Ljava/lang/Object; 43: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 46: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream; 49: aload 5 51: invokevirtual #9; //Method getI:()Ljava/lang/Object; 54: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 57: return }