反射による集合汎型の本質の理解

1222 ワード

ArrayListコレクションでテストを行います.
import java.util.ArrayList;

public class FanXingTest {

	public static void main(String[] args) {
		ArrayList list1 = new ArrayList();
		ArrayList list2 = new ArrayList();
		list2.add("hello");

		// list2.add(20); // , 

		//  
		Class c1 = list1.getClass();
		Class c2 = list2.getClass();
		System.out.println(c1 == c2); // true
	}
}

反射操作はいずれもコンパイル後の操作(バイトコードになった後)であり,実行時期の操作である.
以上の結果から,コンパイル後の集合の汎用化は非汎用化であることが分かる.
次に、反射によって検証します.汎用バイパスコンパイルは無効です.
import java.lang.reflect.Method;
import java.util.ArrayList;

public class FanXingTest {

	public static void main(String[] args) throws Exception {
		ArrayList list1 = new ArrayList();
		ArrayList list2 = new ArrayList();
		list2.add("hello");

		//  
		Class c1 = list1.getClass();
		Class c2 = list2.getClass();

		Method m = c2.getMethod("add", Object.class); //  ( Object , )
		//  invoke   20 list2 
		m.invoke(list2, 20);
		System.out.println(list2.size()); // 2
		System.out.println(list2); // [hello, 20]
	}
}

以上のテストを経て,Javaにおける集合の汎用型は誤入力を防止し,コンパイル段階のみ有効であり,実行時期に失効することを説明した.