消除对泛型和泛型的限制
来源:互联网 发布:gis软件开发工程师 编辑:程序博客网 时间:2024/05/17 01:28
本文转载至51CTO
原地址:http://book.51cto.com/art/201108/280386.htm###
泛型是使用一种称为类型消除(type erasure)的方法来实现的。编译器使用泛型类型信息来编译代码,但是随后会消除它。因此,泛型信息在运行时是不可用的。这种方法可以使泛型代码向后兼容使用原始类型的遗留代码。
泛型存在于编译时。一旦编译器确认泛型类型是安全使用的,就会将它转换为原始类型。例如,编译器会检查在图a中的代码里泛型是否被正确使用,然后将它翻译成如图b所示的在运行时使用的等价代码。图b中的代码使用的是原始类型。
当编译泛型类、接口和方法时,编译器用Object类型代替泛型类型。例如,编译器会将图a中的方法转换为图b中的方法。如果一个泛型类型是不受限的,那么编译器就会用一个受限类型来替换它。例如,编译器会将图a中的方法转换为图b中的方法。
非常需要注意的是,不管实际的具体类型是什么,泛型类是被它的所有实例所共享的。假定按如下方式创建list1和list2:
尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型,但是,在运行时只有一个ArrayList类会被加载到JVM中。list1和list2都是ArrayList的实例,因此,下面两条语句的执行结果都为true:
但是表达式list1 instanceof ArrayList<String>是错误的。由于ArrayList<String>并没有在JVM中存储为单独一个类,所以,在运行时使用它是毫无意义的。
由于泛型类型在运行时被消除,因此,对于如何使用泛型类型是有一些限制的。下面是其中的一些限制:
限制1:不能使用new E()
不能使用泛型类型参数创建实例。例如,下面的语句是错误的:
出错的原因是运行时执行的是new E(),但是运行时泛型类型E是不可用的。
限制2:不能使用new E[]
不能使用泛型类型参数创建数组。例如,下面的语句是错误的:
可以通过创建一个Object类型的数组,然后将它的类型转换为E[]来规避这个限制,如下所示:
但是,类型转换到(E[])会导致一个免检的编译警告。该警告会出现是因为编译器无法确保在运行时类型转换能成功。例如,如果E是String,而new Object[]是Integer对象的数组,那么(String[])(new Object[])将会导致ClassCastException异常。这种类型的编译警告是对Java泛型的限制,也是无法避免的。
不允许使用泛型类创建泛型数组。例如,下面的代码是错误的:
可以使用下面的代码来规避这种限制:
你将会得到一个编译警告。
限制3:在静态环境下不允许类的参数是泛型类型
由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例所共享的。因此,在静态方法、数据域或者初始化语句中,为了类而引用泛型类型参数是非法的。例如,下面的代码是非法的:
限制4:异常类不能是泛型的
泛型类不能扩展java.lang.Throwable,因此,下面的类声明是非法的:
为什么?如果允许这择做,就应为MyException<T>添加一个catch子句,如下所示:
JVM必须检查这个从try子句中抛出的异常以确定它是否与catch子句中指定的类型匹配。但这是不可能的,因为在运行时类型信息是不出现的。
- 消除对泛型和泛型的限制
- 泛型的限制
- 泛型类型消除 lesson3
- Java消除泛型警告
- java中利用反射机制绕开编译器对泛型的类型限制
- java泛型使用的简单规则和限制
- 泛型类型的限制
- 泛型--泛型的限制
- 消除navbar和tabbar对坐标的影响
- POSIX对pthread的选项和限制
- memcached对key和value的限制
- 如何消除PB5/6的时间限制?
- 消除对英语的恐惧
- 消除对英语的恐惧
- 消除对Java的偏见
- C#泛型限制
- Java泛型限制
- 泛型限制基础
- 最常用的15大Eclipse开发快捷键技巧
- HTML5(三)
- 深入理解Java垃圾回收机制
- 3.常量指针、指针常量、指针数组、数组指针、指针函数、函数指针
- wait()函数,作用:阻塞等待任意子进程,回收子进程8kb物理内存
- 消除对泛型和泛型的限制
- Python学习日记 第四天
- 《TCP/IP详解 卷1》 笔记: TCP的交互数据流
- kubernetes的编译、打包
- LeetCode Integer to Roman
- Android 国际货币格式化的一个小知识点
- 分布式系统事务一致性解决方案
- 八周第一次课 2017.12.4 linux任务计划cron、chkconfig工具、systemd管理服务、unit介绍、target介绍
- 字符集(ASCII、GB***、Big5、Unicode)及字符编码(UTF-*等)