黑马程序员技术交流社区

标题: 泛型问题 [打印本页]

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

以上的部分没看懂,求大神来个通俗点的讲解
作者: skill20    时间: 2014-5-19 23:35
泛型只是一种类型安全机制。对运行时出现的类型转换异常转移到编译时期,让程序员更好的修改代码。
其实用反射可以验证在程序运行时期,泛型类型会擦除。
作者: youcyou    时间: 2014-5-20 22:09
skill20 发表于 2014-5-19 23:35
泛型只是一种类型安全机制。对运行时出现的类型转换异常转移到编译时期,让程序员更好的修改代码。
其实用 ...

在运行时,如何知道获取的元素类型而不用强转呢?
这句怎么解释啊
作者: skill20    时间: 2014-5-20 22:27
youcyou 发表于 2014-5-20 22:09
在运行时,如何知道获取的元素类型而不用强转呢?
这句怎么解释啊

运行后泛型擦除了。我没理解你的意思。。。惭愧!
作者: youcyou    时间: 2014-5-20 22:47
skill20 发表于 2014-5-20 22:27
运行后泛型擦除了。我没理解你的意思。。。惭愧!

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

作者: 艮昕辶    时间: 2014-5-21 16:42
标题: 编译没错运行的时候还是要检测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. }
复制代码

作者: Hosing    时间: 2014-7-3 16:13
什么是泛型?

作者: 马到成功2014    时间: 2014-7-3 16:44
泛型就是编译器帮你检查了一遍,你要存储的对象是否一致

作者: zhohao    时间: 2014-7-3 17:59
就是说泛型是为了有提升功能的意思,在用泛型的时候编译器编译成功后,泛型就已经被转换成了你需要的类型,所以编译后的文件时无所谓泛型的,泛型是相对于程序员开发的时期所说的。至于不需要转换是说,你的泛型已经被你定义了类型所以下面在使用时当然就不用再做转换动作了。
作者: wisely    时间: 2014-7-3 18:02
马到成功2014 发表于 2014-7-3 16:44
泛型就是编译器帮你检查了一遍,你要存储的对象是否一致

言简意赅,一阵见血!




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