Java基础之泛型
来源:互联网 发布:免费网络主播色情表演 编辑:程序博客网 时间:2024/06/07 03:06
一些术语
- 参数化类的类型(parameterized type):含有类型参数的类型,例如List<String>
- 原生态类型(raw type):没有类型参数的类型,例如List
- 无限制通配符类型(unbounded wildcard type):例如List<?>
原生态类型保留的原因:兼容性
List, List<Object>, List<String>, List<?>的讨论
- 形如List的是原生态类型,是类型不安全的,逃避了泛型检查
- List<Object>明确告诉编译器它可以持有Object类型的对象,List<String>明确告诉编译器它可以持有String类型的对象,但是List类型的引用可以接受List<Object>,List<String>的实例对象,但是List<Object>的引用不可以接受List<String>的实例对象。也就是所谓的泛型集合是不具有协变性(covariant)的.
- 无限制通配符类型如List<?>说明该List持有某种特定类型的对象,但是不知道具体是哪一种类型,所以不能向这种List中添加任何对象,因为编译器并不能 判定这种添加是否是正确的,所以会在编译阶段报错。相比原生态类型,List则可以添加任何对象,因为编译阶段并没有做类型检查。
优先使用列表而不是数组
数组是协变的(covariant),所谓数组是协变的,是指如果Sub是Super的子类型,那么数组类型Sub[]也是Super[]的子类型。
而泛型是通过擦除(erasure)来实现的,泛型是只在编译时强化它们的类型信息,并在运行时丢弃它们的元素类型信息。所以泛型不是协变的,上面第2条List<Object>并不是List<String>的父类。
所以数组和泛型不能很好的混用,如创建泛型对象数组:new E[],参数化类型或者类型参数的数组:new List<E>[], new List<String>[]是非法的。
类型擦除对泛型的限制
由于泛型仅仅是在编译时有了较强的类型检查,而实际编译后所产生的是没有泛型信息的运行代码,所以这导致泛型有许多限制。
- 泛型类中,static方法和static域均不可引用类的类型变量
- 不能实例化泛型类型实例,也就是使用类似于new T()的形式
- 不能实例化泛型数组
Comparable<T>接口
实现Comparable<T>接口,实现其中的compareTo方法可以使对象的对比更高效。
参考文献:使用通配符简化泛型使用
阅读全文
0 0
- Java基础之泛型
- java基础之泛型
- java泛型之基础
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- JAVA基础之泛型
- Java之泛型基础
- java基础之泛型
- java基础之泛型
- java基础之泛型
- Java基础之泛型
- java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- [算法]找出单链表中的倒数第k个元素
- CSS笔记
- Python 3 was configured to use ASCII as encoding for the environment 问题解决
- Unity 流程控制
- 数据库索引的作用和优点缺点
- Java基础之泛型
- numpy.tile
- Java进阶之虚拟机《一》:Java内存区域与内存溢出
- Kubernetes的基本概念说明
- 模拟实现C库的atoi和itoa——题集(二十三)
- [C专家]分析C语言声明——只有编译器才会喜欢的语法
- NavigationView使用简介
- Python5:Script
- 编写真正的单元测试