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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© youcyou 中级黑马   /  2014-5-19 23:16  /  1689 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型技术:其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了。
为什么? 因为泛型的擦除:也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。
在运行时,如何知道获取的元素类型而不用强转呢?
泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。

以上的部分没看懂,求大神来个通俗点的讲解

9 个回复

倒序浏览
泛型只是一种类型安全机制。对运行时出现的类型转换异常转移到编译时期,让程序员更好的修改代码。
其实用反射可以验证在程序运行时期,泛型类型会擦除。
回复 使用道具 举报
skill20 发表于 2014-5-19 23:35
泛型只是一种类型安全机制。对运行时出现的类型转换异常转移到编译时期,让程序员更好的修改代码。
其实用 ...

在运行时,如何知道获取的元素类型而不用强转呢?
这句怎么解释啊
回复 使用道具 举报
youcyou 发表于 2014-5-20 22:09
在运行时,如何知道获取的元素类型而不用强转呢?
这句怎么解释啊

运行后泛型擦除了。我没理解你的意思。。。惭愧!
回复 使用道具 举报
skill20 发表于 2014-5-20 22:27
运行后泛型擦除了。我没理解你的意思。。。惭愧!

好吧,可能我描述不清楚吧
我记得毕老师有个泛型的例子是接收一个person的  然后在内部判断是不是student是不是和这句有关啊  
回复 使用道具 举报

编译没错运行的时候还是要检测hs_String这个集合中元素类型

本帖最后由 艮昕辶 于 2014-5-21 16:44 编辑
  1. package test;

  2. import java.util.HashSet;

  3. public class Demo1636 {
  4.         public static void main(String[]args){
  5.                 HashSet hs=new HashSet();
  6.                 hs.add(new Integer(1));
  7.                 hs.add(new Integer(11));
  8.                 HashSet<String>hs_String=hs;
  9.                 System.out.println(hs_String);
  10.                
  11.                 for(String str:hs_String){
  12.                         System.out.println(str.length());
  13.                 }
  14.                
  15.         }
  16. }
复制代码
回复 使用道具 举报
什么是泛型?
回复 使用道具 举报
泛型就是编译器帮你检查了一遍,你要存储的对象是否一致
回复 使用道具 举报
就是说泛型是为了有提升功能的意思,在用泛型的时候编译器编译成功后,泛型就已经被转换成了你需要的类型,所以编译后的文件时无所谓泛型的,泛型是相对于程序员开发的时期所说的。至于不需要转换是说,你的泛型已经被你定义了类型所以下面在使用时当然就不用再做转换动作了。
回复 使用道具 举报
马到成功2014 发表于 2014-7-3 16:44
泛型就是编译器帮你检查了一遍,你要存储的对象是否一致

言简意赅,一阵见血!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马