2017
09.19
09.19
在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); }