|
|
51CTO旗下网站
|
|
移动端

1.5.8 对于泛型的限制

《数据结构与算法分析:Java语言描述(原书第3版)》第1章引论,在这一章, 我们阐述本书的目的和目标并简要复习离散数学以及程序设计的一些概念。本节为大家介绍对于泛型的限制。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 11:15

1.5.8 对于泛型的限制

对于泛型类型有许多的限制。由于类型擦除的原因, 这里列出的每一个限制都是必须要遵守的。

基本类型

基本类型不能用做类型参数。因此, GenericMemoryCell<int>是非法的。我们必须使用包装类。

instanceof检测

instanceof检测和类型转换工作只对原始类型进行。在下列代码中:

这里的类型转换在运行时是成功的, 因为所有的类型都是GenericMemoryCell。但在最后一行, 由于对read的调用企图返回一个String对象从而产生一个运行时错误。结果, 类型转换将产生一个警告, 而对应的instanceof检测是非法的。

static的语境

在一个泛型类中, static方法和static域均不可引用类的类型变量, 因为在类型擦除后类型变量就不存在了。另外, 由于实际上只存在一个原始的类, 因此static域在该类的诸泛型实例之间是共享的。

泛型类型的实例化

不能创建一个泛型类型的实例。如果T是一个类型变量, 则语句

是非法的。T由它的限界代替, 这可能是Object(或甚至是抽象类), 因此对new的调用没有意义。

泛型数组对象

也不能创建一个泛型的数组。如果T是一个类型变量, 则语句

是非法的。T将由它的限界代替, 这很可能是Object T, 于是(由类型擦除产生的)对T[]的类型转换将无法进行, 因为Object[] IS-NOT-A T[]。由于我们不能创建泛型对象的数组, 因此一般说来我们必须创建一个擦除类型的数组, 然后使用类型转换。这种类型转换将产生一个关于未检验的类型转换的编译警告。

参数化类型的数组

参数化类型的数组的实例化是非法的。考虑下列代码:

正常情况下, 我们认为第4行的赋值会生成一个ArrayStoreException, 因为赋值的类型有错误。可是, 在类型擦除之后, 数组的类型为GenericMemoryCell[], 而加到数组中的对象也是GenericMemoryCell, 因此不存在ArrayStoreException异常。于是, 该段代码没有类型转换, 它最终将在第5行产生一个ClassCastException异常, 这正是泛型应该避免的情况。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

大师品软件——软件之痛与应对之道

这并不是一本传统的技术专著,因为它并没有包含一行代码,而更像是一部技术评论。作者通过幽默诙谐而又不失辛辣的语言,从程序员、用户等多...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊