黑马程序员技术交流社区

标题: 张老师高新技术视频“反射得到泛型的实际参数类型” [打印本页]

作者: 編程浪子    时间: 2012-3-10 17:10
标题: 张老师高新技术视频“反射得到泛型的实际参数类型”
理论上使用泛型,在编译时类型就会被擦除掉,那么为什么,
01.package cn.itcast.generic;  
02.  
03.import java.lang.reflect.Method;  
04.import java.lang.reflect.ParameterizedType;  
05.import java.lang.reflect.Type;  
06.import java.util.Date;  
07.import java.util.Vector;  
08.  
09.public class GenericDemo1 {  
10.  
11.    public static void main(String[] args) throws Exception, NoSuchMethodException {  
12.         
13.        Vector<Date> vector = new Vector<Date>();  
14.        Method applyMethod = GenericDemo1.class.getMethod("apply", Vector.class);  
15.        Type[] types = applyMethod.getGenericParameterTypes();  
16.        ParameterizedType pType = (ParameterizedType) types[0];  
17.        System.out.println(pType.getRawType());  
18.        System.out.println(pType.getActualTypeArguments()[0]);  
19.    }  
20.      
21.    public static void apply(Vector<Date> v) {  
22.         
23.    }  
24.}  
运行结果为:java.util.Date,
这是为什么呢??大神们给小弟说说你们的理解,
作者: 冯旭君    时间: 2012-3-11 01:09
首先声明一下,反射并不是编译时发生的,而是在运行时发生的。运行时必然会得到实际的参数类型。
作者: 編程浪子    时间: 2012-3-11 11:34
冯旭君 发表于 2012-3-11 01:09
首先声明一下,反射并不是编译时发生的,而是在运行时发生的。运行时必然会得到实际的参数类型。 ...

这个我知道,但是 public static void apply(Vector<Date> v) 中的Vector<Date>这个Date不是在编译时就被擦除掉吗?那反射时怎么能得到呢??
作者: 冯旭君    时间: 2012-3-11 11:44
擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点,这正是编译器在编译期执行类型检查并插入转型代码的地点。

泛型中的所有动作都发生在边界处:对传递进来的值进行额外的编译期检查,并插入 对传递出去的值的转型。

作者: 黑马刘涛    时间: 2012-8-5 21:18
冯旭君 发表于 2012-3-11 11:44
擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点,这正是编译器在 ...

嘿,这段话我在一个人的博客里看到过,那篇文章很透彻讲了泛型。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2