反射による集合汎型の本質の理解
1222 ワード
ArrayListコレクションでテストを行います.
反射操作はいずれもコンパイル後の操作(バイトコードになった後)であり,実行時期の操作である.
以上の結果から,コンパイル後の集合の汎用化は非汎用化であることが分かる.
次に、反射によって検証します.汎用バイパスコンパイルは無効です.
以上のテストを経て,Javaにおける集合の汎用型は誤入力を防止し,コンパイル段階のみ有効であり,実行時期に失効することを説明した.
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における集合の汎用型は誤入力を防止し,コンパイル段階のみ有効であり,実行時期に失効することを説明した.