黑马程序员技术交流社区

标题: 疑惑,泛型问题,下面的代码为什么结果为true。 [打印本页]

作者: 李深山    时间: 2012-3-15 16:27
标题: 疑惑,泛型问题,下面的代码为什么结果为true。
public class ErasedTypeEquivalence{
public static void main(String[] args){
Class c1= new ArrayList<String>.getClass();
Class c1= new ArrayList<Integer>.getClass();
System.out.println(c1==c2)
}
}
结果为true,为什么,高手解答下。
作者: 张开开    时间: 2012-3-15 16:33
同学,好好看下泛型和反射。getClass()方法是得到的字节码,也就是这个对象是哪个类的对象,你上面的两个对象都是ArrayList的对象,当然返回的都是ArrayList的字节码了,
所以是相同的,这里和泛型没什么关系
作者: foxpeter    时间: 2012-3-15 16:38
可以理解成得到的Class都是 ArrayList<?>
作者: 张润政    时间: 2012-3-15 16:43
这里是反射的基本概念啊。比如我们说String类型的所有对象调用的都是同一份Class字节码,这一份字节码new出来了好多个带参数的,不带参数的,带好几个参数的,等等N多对象。
你这段程序中,c1和c2同是使用了同一份Class字节码new出来的,ArrayList的作用就是存储对象的,不管是什么对象吧,那么它的字节码new出来的对象也是这么一个功能,不管你存什么泛型的数据,我都能给你new出来,只要你存的而是对象,所以我也不管你存的是什么类型。
这里加入泛型的作用是,强制性的让编译时的错误转移到了编译时期。提高了安全性啊。
作者: 李深山    时间: 2012-3-15 16:52
楼上说的好,谢谢
作者: 马胜平    时间: 2012-3-15 21:08
在JAVA中并不存ArrayList<String>类型,java的泛型是使用擦除来实现的,在运行时ArrayLiist<String>和ArrayList<Integer>实际上是相同的类型(相同的字节码)。这两种形式都被擦除成原生态的类型。擦除并不是java的语言特性是JAVA实现泛型的一种折中方式,因为泛型并不是一开始就有,如果jdk1.0i时候就考虑到了泛型,那么泛型就会像C++模版那样具体化。
作者: 李成    时间: 2012-3-16 07:01
  泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,个体Class()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的输入。





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