A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

理论上使用泛型,在编译时类型就会被擦除掉,那么为什么,
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,
这是为什么呢??大神们给小弟说说你们的理解,

4 个回复

倒序浏览
首先声明一下,反射并不是编译时发生的,而是在运行时发生的。运行时必然会得到实际的参数类型。
回复 使用道具 举报
冯旭君 发表于 2012-3-11 01:09
首先声明一下,反射并不是编译时发生的,而是在运行时发生的。运行时必然会得到实际的参数类型。 ...

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

泛型中的所有动作都发生在边界处:对传递进来的值进行额外的编译期检查,并插入 对传递出去的值的转型。
回复 使用道具 举报
冯旭君 发表于 2012-3-11 11:44
擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点,这正是编译器在 ...

嘿,这段话我在一个人的博客里看到过,那篇文章很透彻讲了泛型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马