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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 车风波 于 2012-6-27 17:36 编辑
复制代码
  1. public void show(ArrayList<String> s) {

  2. }

  3. public static void main(String[] args) {
  4. try {
  5. Method method = Test.class.getMethod("show", ArrayList.class);
  6. Type[] types = method.getGenericParameterTypes(); //取得此方法的所有参数
  7. ParameterizedType type = (ParameterizedType) types[0]; //取得第一个参数强转成参数化类型(泛型)
  8. Type argType = type.getActualTypeArguments()[0];//取得泛型的第一个实际类型参数
  9. System.out.println(argType); //结果为String
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }

  13. }
复制代码
如题,泛型不是只在源代码中起作用吗,编译成class运行怎么还能保存ArrayList的实际类型参数String? 泛型存在于class中吗?存在于运行时加载到内存中的文件中吗?

a.jpg (34.38 KB, 下载次数: 53)

a.jpg

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
在内存中应该是所有需要泛型转化的都已经转化完成了吧,不能说是存在,应该时候已经转完了
回复 使用道具 举报
你的.class文件就是通过源代码生成的,泛型存在于源代码中肯定就存在于.class文件中。
在加载如内存的时候应该已经对泛型的转换完成了。
自己的理解,楼主参考一下。
回复 使用道具 举报
薄炳鑫 发表于 2012-6-17 20:27
你的.class文件就是通过源代码生成的,泛型存在于源代码中肯定就存在于.class文件中。
在加载如内存的时候 ...

第一句话不赞同 ,就像注解,有的在编译成class的时候就没了,有的在内存中就没了。
回复 使用道具 举报
Java中的泛型虽然是作用在编译阶段,可是编译的时候如果类型不对的话,是肯定会出错,这样就保证了,你存入的类型是真实的类型,就是说在JVM看来,你存到内存中的就是真实的类型,所以当你运行之后访问它的类型的时候,它仍然得到真实的类型。
回复 使用道具 举报
王广丛 发表于 2012-6-17 20:58
Java中的泛型虽然是作用在编译阶段,可是编译的时候如果类型不对的话,是肯定会出错,这样就保证了,你存入 ...

你是说 如果我add("abc")它会在内存中判断abc是什么类型吗?
回复 使用道具 举报
ParameterizedType type = (ParameterizedType) types[0]; //取得第一个参数强转成参数化类型(泛型)
Type argType = type.getActualTypeArguments()[0];//取得泛型的第一个实际类型参数
System.out.println(argType); //结果为String

第一行并不是获取泛型的类型,是形参的类型,所以后面都不用再问,泛型是在编译时就去除了,所以编译后的class文件里面没有泛型的任何信息

回复 使用道具 举报
潘东升 发表于 2012-6-17 22:24
ParameterizedType type = (ParameterizedType) types[0]; //取得第一个参数强转成参数化类型(泛型)
Type ...

为什么运行的时候能取得泛型的实际类型参数呢?
回复 使用道具 举报
车风波 发表于 2012-6-17 22:47
为什么运行的时候能取得泛型的实际类型参数呢?

存进去的时候是按照泛型限制的类型存进去的,取出来的类型一般也就是泛型,但是并不是绝对的,因为泛型的编译后就擦除了,所以用反射可以给集合里面存非泛型限制的类型,这样取出来的时候就不是和泛型类型一样的了
回复 使用道具 举报
潘东升 发表于 2012-6-18 08:25
存进去的时候是按照泛型限制的类型存进去的,取出来的类型一般也就是泛型,但是并不是绝对的,因为泛型的 ...

既然运行的时候能用反射存入任何类型,说明运行时就没有泛型的限制了。但我的代码运行时为什么还能取得泛型的实际类型参数呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马