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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zuochbd 中级黑马   /  2014-9-26 13:15  /  1170 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频里说, class文件没有保留泛型信息.
我个人觉得这个说法是不妥的.
因为Class类中有这以下三个方法:
Type[] getGenericInterfaces() ---取接口
Type getGenericSuperclass()   ---取父类
TypeVariable<Class<T>>[] getTypeParameters() ---取类的类型参数




更不用说视频里提到的Method类中的:
Type[] getGenericParameterTypes()
这个Method中还有这两个方法:
Type[] getGenericExceptionTypes()
Type getGenericReturnType()


但为什么ArrayList<String>对象.getClass()==ArrayList<Integer>对象.getClass()呢?
这是因为它们用的是同一个class文件.
即, 同一种类型. 只是它们对应的类型参数不同而已.
因此我觉得class文件中应当有一个地方存放着这些类型参数的.
所以, 我认为那种认为编译时把泛型信息全部过滤掉的观点不可取.






评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 fantacyleo 于 2014-9-26 14:01 编辑

其实视频里也没说完全被抹掉,而且还举了个例子,通过反射获取方法形参中的泛型,比如有个形参Vector<Integer> v,那么其中的Integer是可以被获取的。这里有个含义理解的问题。擦除的泛型信息到底指什么?我也没完全搞清楚,暂时认可网上的一种说法:源代码里声明的泛型信息是可以在运行时获取的。这里的“声明”指的是定义类、接口、方法、枚举。比如说public ArrayList<E> {}这叫声明,但是ArrayList<Integer> al = new ArrayList<Integer>()就不叫声明而是“声明的使用”(这个区分还是挺重要的,Java的源程序模型框架就用到了这个区分,可参考我录制的视频第4-5集http://bbs.itheima.com/thread-137509-1-1.html

所以,如果你把那些泛型反射方法作用于ArrayList<Integer> al = new ArrayList<Integer>(),你得到的只能是“E”,而不是你所期待的Integer。因为E是声明的泛型信息,Integer是“使用声明”中的泛型信息,后者被擦除了。

当然,想得到最权威的答案就要去看java language specification和JVM specification两份文档了

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 很给力!

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-9-26 13:58
其实视频里也没说完全被抹掉,而且还举了个例子,通过反射获取方法形参中的泛型,比如有个形参Vector v,那 ...

谢谢指正:)
Java之路漫长啊...
好多大部头的书...
回复 使用道具 举报
caixingke 发表于 2014-9-26 14:14
谢谢指正
Java之路漫长啊...
好多大部头的书...

哈哈,按理说你经过3年C++的历练,Java的复杂度只能算一般吧?
回复 使用道具 举报
fantacyleo 发表于 2014-9-26 14:35
哈哈,按理说你经过3年C++的历练,Java的复杂度只能算一般吧?

做C/C++功能机开发, 我们主要依赖于开发平台, 给客户做一些功能之类.
熟悉一个开发平台不容易, 代码量很大, 上千万行. 对于平台之外的东西, 我们很少涉及.
功能机的功能比较单一, 我们连数据库都没有涉及, 也很少涉及网络通信. 呵呵.
除了做一点MMI层的东西, 我们比较偏向于底层一些, 即嵌入式这一块.
但嵌入式其实涉及的东西并不多, 有组成原理和微机原理的基础的话, 这就够了.
看到java涉及那么多东西, 确实有点让人应接不暇.

评分

参与人数 1黑马币 +20 收起 理由
fantacyleo + 20

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-9-26 14:35
哈哈,按理说你经过3年C++的历练,Java的复杂度只能算一般吧?

我之所以觉得Java之路漫长,
是因为我觉得学这门语言要花费的精力很大.
而C/C++语言, 就那么点东西.
但Java语言, 因为有虚拟机的支持, 其直接在语言里支持了多线程等等功能.
所以, 其语言系统很庞大, 有些被隐藏起来的机制让初学者捉急.
回复 使用道具 举报
caixingke 发表于 2014-9-26 14:47
做C/C++功能机开发, 我们主要依赖于开发平台, 给客户做一些功能之类.
熟悉一个开发平台不容易, 代码量很 ...

嗯嗯,原来区别还是蛮大的。再帮你加点分吧,祝你早日入学黑马!:P
回复 使用道具 举报
fantacyleo 发表于 2014-9-26 15:00
嗯嗯,原来区别还是蛮大的。再帮你加点分吧,祝你早日入学黑马!

非常谢谢:)
回复 使用道具 举报
看两位高手的问答,是非常爽的事情~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马