在java里使用泛型声明1个Integer类型的list,一般情况下只能保存integer类型的对象。如果放入其它类型的对象则会报错。
其实,java的泛型只是伪泛型,即在编译前会做检查,编译后的字节码里不会保留泛型信息。
private static void foo() {
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass());
System.out.println(list1.getClass()==list2.getClass());
}
从上面的代码看到,2个不同类型的list的class都是java.util.ArrayList,不包含泛型信息。
由此想到,我们可以使用反射将一个不同类型的对象放入泛型集合里。
private static void addStringToIntList() {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);
String value = "abc";
try {
list.getClass().getMethod("add", new Class[]{Object.class}).invoke(list, value);
}
catch(Exception e) {
e.printStackTrace();
}
System.out.println(list);
}



