【Java笔记】泛型擦除

要求:定义ArrayList<String>集合,如何实现向集合中添加Integer类型的值?

实现这个要求前,我们可以先了解伪泛型的概念,即编译后的Class文件中其实是没有泛型约束的,请看代码:

public class Test {
public void doTwo(List<String> list){
}
public void doTwo(List<Integer> list){
}
}

上面的代码, 会在编译的时候出问题, 因为参数List<String> list 和 List<Integer> list会在编译后会被擦除掉 ,变成原生一模一样的类型List<E>,导致无法重载,这就是Java中的伪泛型。

那么既然编译后的Class文件没有泛型,那么我们就可以通过反射对Class文件进行操作,达到将不同类型的数值放入固定类型的集合中的目的。

实现步骤:1.通过反射获取集合中Class文件对象

                  2.通过Class文件对象,调用集合的add方法存储数值

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<Integer>();
		//添加元素到集合
		list.add(new Integer(30));
		list.add(new Integer("12345"));
		list.add(123);
		//list.add("哈哈");//因为有泛型类型的约束
		System.out.println(list);
		
		//通过反射技术,实现添加任意类型的元素
		//1, 获取字节码文件对象
		//Class c = list.getClass();
		//Class c = ArrayList.class;
		Class c = Class.forName("java.util.ArrayList");
		
		//2, 找到add()方法
		// public boolean add(E e)
		Method addMethod = c.getMethod("add", Object.class);
		
		//3,  执行add()方法
		addMethod.invoke(list, "哈哈");// list.add("哈哈");
		System.out.println(list);
	}
}

其实泛型擦除并没有什么实际价值,只是为了让我们更了解通过反射获得类的方法运行而已。

猜你喜欢

转载自blog.csdn.net/qq_42370146/article/details/84037890