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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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,为什么,高手解答下。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

6 个回复

倒序浏览
同学,好好看下泛型和反射。getClass()方法是得到的字节码,也就是这个对象是哪个类的对象,你上面的两个对象都是ArrayList的对象,当然返回的都是ArrayList的字节码了,
所以是相同的,这里和泛型没什么关系
回复 使用道具 举报
可以理解成得到的Class都是 ArrayList<?>
回复 使用道具 举报
这里是反射的基本概念啊。比如我们说String类型的所有对象调用的都是同一份Class字节码,这一份字节码new出来了好多个带参数的,不带参数的,带好几个参数的,等等N多对象。
你这段程序中,c1和c2同是使用了同一份Class字节码new出来的,ArrayList的作用就是存储对象的,不管是什么对象吧,那么它的字节码new出来的对象也是这么一个功能,不管你存什么泛型的数据,我都能给你new出来,只要你存的而是对象,所以我也不管你存的是什么类型。
这里加入泛型的作用是,强制性的让编译时的错误转移到了编译时期。提高了安全性啊。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
楼上说的好,谢谢
回复 使用道具 举报
在JAVA中并不存ArrayList<String>类型,java的泛型是使用擦除来实现的,在运行时ArrayLiist<String>和ArrayList<Integer>实际上是相同的类型(相同的字节码)。这两种形式都被擦除成原生态的类型。擦除并不是java的语言特性是JAVA实现泛型的一种折中方式,因为泛型并不是一开始就有,如果jdk1.0i时候就考虑到了泛型,那么泛型就会像C++模版那样具体化。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
李成 中级黑马 2012-3-16 07:01:37
7#
  泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,个体Class()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的输入。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马