Java 泛型类型的一些限制
由于泛型类型在运行时被消除,因此,对于如何使用泛型类型是有一些限制的。
限制1:不能使用new E()
不能使用泛型类型参数创建实例。例如,下面的语句是错误的:
E object = new E();
出错的原因是运行时执行的是new E(),但是运行时泛型类型E是不可用的。
限制2:不能使用new E()
不能使用泛型类型参数创建数组。例如,下面的语句是错误的。
E[] elements = new E[capacity];
可以通过创建一个Object类型的数组,然后将它的类型转换为E[]来规避这个限制,如下所示:
E[] elements = (E[]) new Object[capacity];
但是,类型转换到(E())会导致一个免检的便已警告。该警告会出现是因为编译器无法确保在运行时类型转换能成功。例如,如果E是String,而new Object[]是Integer对象的数组,那么(String[])(new Object[])将会导致ClassCastException异常。这种类型的编译警告是对Java泛型的限制,也是无法避免的。
不能使用泛型类创建泛型数组。例如,下面的代码是错误的:
ArrayList<String> list = new ArrayList<String>[10];
可以使用下面的代码来规避这个限制:
ArrayList<String> list = (ArrayList<String>[]) new ArrayList[10];
你将会得到一个编译警告。
限制3:在静态环境下不允许类的参数是泛型类型
由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例所共享的。因此,在静态方法、数据域或者初始化语句中,为了类而引用泛型类型参数是非法的。例如,下面的代码是非法的:
public class Test<E> {
public static void m(E o1) { // Illegal
}
public static E o1; // Illegal
static {
E o2; // Illegal
}
}
限制4:异常类不能是泛型的
泛型类不能扩展java.lang.Throwable,因此,下面的类声明是非法的:
为什么?如果允许这么做,就应为MyException<T>添加一个catch子句,如下所示:
public class MyException<T> extends Exception {
}
JVM必须检查这个从try子句中抛出的异常以确定它是否与catch子句中指定的类型匹配。但这是不可能的,因为在运行时类型信息是不出现的。
try {
...
}
catch (MyException<T> ex) {
...
}
Java 泛型类型的一些限制的更多相关文章
- Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List 和 List 在编译成字 ...
- 掌握 Java 泛型类型(一)
为理解泛型类型为何如此有用,我们要将注意力转向 Java 语言中最容易引发错误的因素之一 - 需要不断地将表达式向下类型转换(downcast)为比其静态类型更为具体的数据类型(请参阅参考资料中的&q ...
- Java泛型类型擦除以及类型擦除带来的问题
目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...
- Java 泛型类型基础
为什么要使用泛型? 未使用泛型的情况: // 创建列表类 List list = new ArrayList(); // 添加一个类型为 String 的列表元素 list.add("hel ...
- Java,泛型类型通配符和C#对照
c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,仅仅是语法糖,在编译器编译的时候都转换成object类型 类型通配符在java中表示的是泛型类型的父类 ...
- 记一次由于Java泛型类型擦除而导致的问题,及解决办法
中所周知,Java中的泛型并不像C++.C#一样是真正的泛型,其泛型是通过类型擦除来实现的.具体什么是类型擦除,可以参看这篇博文:http://icyfenix.iteye.com/blog/1021 ...
- Java泛型类型擦除导致的类型转换问题
初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...
- Java泛型类型
E element 常用于集合中表示存放元素 T type Java类 K key 键 V value 值 N number 数值类型 ? 不确定的类型 一种约定俗成吧
- Java泛型类型擦除与运行时类型获取
Java的泛型大家都知道是类型擦除的方式实现的,“编译器会进行泛型擦除”是一个常识了(实际擦除的是参数和自变量的类型).“类型擦除” 并非像许多开发者认为的那样,在 <..> 符号内的东西 ...
随机推荐
- [liu yanling]软件测试技巧
1.添加.修改功能 (1)是否支持tab键 (2)是否支持enter键 (3)不符合要求的地方是否有错误提示 (4)保存后,是否也插入到数据库中 (5)字段唯一的,是否可以重复添加 (6)对编辑页列表 ...
- The Moving Points
Problem Description There are N points in total. Every point moves in certain direction and certain ...
- Java笔记(十)……面向对象II封装(Encapsulation)
封装概念 封装: 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离. 便于使用. 提高重用性. 提高安全性. 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性都隐藏,提 ...
- 三星S4使用体验(Markdown版)
由于各种原因,前几天把手上的HTC 606w给二手交易了,然后二手买了一只全新的韩版S4蓝色e330s作为主力手机使用.现在主要就用户体验的角度对这只新的手机做次评价. 第一次做手机的评价,不知道写成 ...
- poj 2367 Genealogical tree (拓扑排序)
火星人的血缘关系很奇怪,一个人可以有很多父亲,当然一个人也可以有很多孩子.有些时候分不清辈分会产生一些尴尬.所以写个程序来让n个人排序,长辈排在晚辈前面. 输入:N 代表n个人 1~n 接下来n行 第 ...
- URL参数带中文,后台接收乱码解决方案
1.前台中文参数用encodeURIComponent()进行编码,如: var textName= encodeURIComponent(name); 2.对整个URL用encodeURI()进行编 ...
- 有关gcc的扩展__attribute__((unused))
================================ Author: taoyuetao Email: tao_yuetao@yahoo.com.cn Blog: taoyuetao.cu ...
- [二]poi实践一
1.创建时间格式的cell 2.创建不同格式的cell(字符串.布尔.数值) 3.读取遍历xls文件 4.抽取excel的内容
- HDU 3259 Wormholes
题意:就是给你一个n,m,t n代表有多少个点.m代表有多少个双向的边 t代表的是虫洞.如今要你判读是否还能够穿越到过去的点 虫洞的意思是给你的边是单向的,而且是负权值(输入的时候是正数) 思路 ...
- Web版的各种聊天工具
直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,非常方便.在此将时汇总 便于大家查找 节约大 ...