问题描述
- 关于Java泛型反射问题
- public static void main(String[] args) {
//告诉编译器我这个集合只能存储String类型的
List col=new ArrayList();//告诉编译器我这个集合只能存储Integer类型的 List<Integer> col2=new ArrayList<Integer>(); //输出结果为:true //这就是常说的去除,编译后jvm虚拟机不会知道这个集合存储什么类型的值 System.out.println(col.getClass()==col2.getClass()); //看我如何将String存储到集合col2中。 /** * 在运行过程中,jvm根本不知道col2应该存放什么类型的数据,只是我们在编译器中限定了。 * 我们通过反射可以获取list的add方法给col2存储其他类型的数据。如这里就可以将“abc”存放到col2中 * 不明白这里为什么参数一定要是Object.class,不能改为String.class */ try { col2.getClass().getMethod(""add"" Object.class).invoke(col2abc""); System.out.println(col2.get(0)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); }}
为什么这里必须是Object.class了,list里的add是泛型啊。col2.getClass().getMethod(""add"" Object.class)
解决方案
Java的反射与泛型
java 泛型与反射(5)
基于java反射对泛型的理解
解决方案二:
list里的add是泛型,然后Object.class就确实类型了啊,它是一个基类
解决方案三:
因为擦除的原因,泛型只有编译器知道,对于JVM来说只知道list
你要是参数改成String.class就通不过编译了吧
解决方案四:
都说了泛型是给编译器看的,所以在编译器编译完成之后实际的class里面是Object
时间: 2024-12-27 00:32:34