不能初始化泛型参数和数组
来源:互联网 发布:详情页美工 编辑:程序博客网 时间:2024/06/10 17:54
泛型类型在编译期被擦除,我们在类初始化时将无法获得泛型的具体参数,比如这样的代码:
class Foo<T>{ private T t =new T(); private T[] tArray=new T[5]; private List<T> list= new ArrayList<T>();}
这段代码有什么问题呢? t、tArray、list都是类变量,都是通过new声明了一个类型, 看起来非常相似啊!但这段代码是编译通不过的,因为编译器在编译时需要获得T类型,但 泛型在编译期类型已经被擦除了,所以new T()和new T[5]都会报错(可能有读者疑惑了 : 泛型类型可以擦除为顶级类Object,那T类型擦除成Object不就可以编译了吗?这样也不 行,泛型只是Java语言的一部分,Java语言毕竟是一个强类型、编译型的安全语言,要确保运行期的稳定性和安全性就必须要求在编译器上严格检査)。可为什么new ArrayList<T>()却 不会报错呢?
这是因为ArrayList表面是泛型,其实已经在编译期转型为Object 了,我们来看一下 ArrayList的源代码就清楚了,代码如下:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //容纳元素的数组 private transient Object[] elementData; //构造函数 public ArrayList() { this(10); } //获得一个元素 public E get(int index) { RangeChecM (index); //返回前强制类型转换 return (E) elementData[index];}}注意elementData的定义,它容纳了 ArrayList的所有元素,其类型是Object数组,因为Object是所有类的父类,_数组又允许协变(Covariant),因此elementData数组可以容 纳所有的实例对象。元素加入时向上转型为Object类型(E类型转为Object),取出时向下 转型为E类型(Object转为E类型),如此处理而已。
在某些情况下,我们确实需要泛型数组,那该如何处理呢?代码如下:
private T t; private T[] tArray; private List<T> list=new ArrayList<T>(); public Foo() {try {Class<?> tType=Class.forName("");t=(T) tType.newInstance();tArray=(T[]) Array.newInstance(tType, 5);} catch (Exception e) {e.printStackTrace();}}
此时,运行就没有任何问题了。剩下的问题就是怎么在运行期获得T的类型,也就是 tType参数,一般情况下泛型类型是无法获取的,不过,在客户端调用时多传输一个T类型 的class就会解决问题。
类的成员变量是在类初始化前初始化的,所以要求在初始化前它必须具有明确的类型, 否则就只能声明,不能初始化。
0 0
- 不能初始化泛型参数和数组
- 数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
- servlet初始化参数和上下文初始化参数
- java静态方法,静态初始化块及静态变量的声明和初始化不能使用泛型的原因
- 初始化:变量和数组
- const变量不能初始化数组长度
- const变量不能初始化数组长度
- memset()不能对整形数组初始化
- 二十六、数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
- 引用初始化、左值右值、函数数组参数
- 数组作为函数参数、scanf初始化指针
- 字符串初始化指针和初始化数组区别
- TIJ读书笔记08-数组的初始化和可变参数形参
- PyTorch参数初始化和Finetune
- PyTorch参数初始化和Finetune
- 类的数组成员无法在参数初始化表中被初始化
- silverLight 获取初始化参数和网页参数
- C#数组定义和初始化
- 【HDU5551 2015 CCPC 南阳国赛L】【水题】Huatuo's Medicine 药罐串线
- 【HDU5547 2015 CCPC 南阳国赛H】【DFS】Sudoku 4x4棋盘的填充
- 【HDU5546 2015 CCPC 南阳国赛G】【DFS】Ancient Go 棋盘围杀 优化写法O(n^2)
- 一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目
- Chapter 5-01
- 不能初始化泛型参数和数组
- 黑马程序员——oc语言学习心得—— Fundation
- Android 开发中,有哪些坑需要注意?
- Chapter 5-02
- hdu 1078(dfs+dp)
- which,whereis,locate,find区别
- js中几种实用的跨域方法原理详解
- 图解HTTP -- 目录
- [c]C语言小练习题