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

回复功能关闭


Hit Counter by http://yizhantech.com/