java-关于Java泛型反射问题

问题描述

关于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

java-关于Java泛型反射问题的相关文章

java基础之泛型

泛型 术语 "?"通配符 通配符的扩展 自定义泛型方法 "擦除"实例 类型参数的类型推断 自定义泛型类 泛型方法和泛型类的比较 泛型和反射 通过反射获得泛型的实际类型参数 本文对泛型的基本知识进行较为全面的总结,并附上简短的代码实例,加深记忆. 泛型 将集合中的元素限定为一个特定的类型. 术语 ArrayList<E> -- 泛型类型 ArrayList -- 原始类型 E -- 类型参数 <> -- 读作"typeof"

Java Reflection(九):泛型

内容索引运用泛型反射的经验法则泛型方法返回类型泛型方法参数类型泛型变量类型 我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实覆盖了一些我们需要泛型信息的需求.在本节中我们会演示一下这些情况. 运用泛型反射的经验法则 下面是两个典型的使用泛型的场景: 1.声明一个需要被参数化(parameterizable)的类/接口. 2.使用一个参数化类. 当

Java中的类反射机制

一.反射的概念 :反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩.其中LEAD/LEAD++ .OpenC++ .MetaXa和OpenJava等就是基于反射机制的语言.最近,反射机制也被应用到了视窗系统.操作系统和文件系统中. 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学

java基础-java中的泛型的具体作用是什么?

问题描述 java中的泛型的具体作用是什么? 看了很多教程,用到泛型的地方很多,最不明白的就是泛型的存在是因为什么,怎么用,什么时候用,求大神

java 泛型 类型擦除-Java 核心技术中泛型的使用

问题描述 Java 核心技术中泛型的使用 在看Java核心技术的过程中有个问题不明白,求各位大神指导. 书中写到: 不能构造一个泛型数组: public static T[] minmax(T[] a) { T[] mm = new T(2); ... } 书中的解释是类型擦除会让这个方法永远构造Object[2]数组. 什么叫永远构造Object[2]数组?是死循环?还是说构造的是Object[2]数组而不是T[2]数组 解决方案 说构造的是Object[2]数组而不是T[2]数组

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

Java学习之——泛型

1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 泛型能在定义类,接口和方法时将类型(类和接口)作为参数.和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码.不同的是 形式参数输入的是值而泛型是类型. 2.为什么使用泛型 1.编译时更加强的(Stronger)类型检测 java编译器对泛型代码进行强类

java中如何用反射创建一个对象

问题描述 java中如何用反射创建一个对象 java中如何用反射创建一个对象 如何理解java的反射,反射是一种怎么样的机制呢 解决方案 楼上说的理论很多了,,给你来点实际的,, Class clazz=Class.forName("test.User"); Object obj=clazz.newInstance(); 这是用反射创建对象的方法之一,,也是最常用的 解决方案二: 反射主要做两件事情,一个是运行时创建(dc)(最典型的,插件程序,插件在主程序后被开发出来,主程序要创建插

Java、Java Applet与 &amp;#106avascript间的通信

摘 要:本文着重阐述了网页开发中,通过灵活使用从JavaScript语言中访问Java的方法.从JavaScript中访问JavaScript小程序的方法与变量,以及在Java Applet小程序中使用JavaScript等技术,实现这几种网页开发语言的互相补充,以开发更完美的Web应用程序. JavaScript是用于HTML环境的开发语言,提供了能够响应Web页面事件的脚本,可以完全访问浏览器窗口的各个方面,善于合并HTML.Java Applet小程序.插入件.服务器方程序和其他Web组件