设为首页 加入收藏

TOP

Java泛型详解
2018-01-17 13:04:50 】 浏览:106
Tags:Java 详解

泛型是Java 5引入的机制, 允许编写不关心具体类型的类或方法. 泛型最著名的应用是Collection框架.


泛型类List在定义时并不关心元素类型, 只有在实例化时才获得具体的元素类型.


声明泛型需要使用<>声明类型参数, 如<T>, <T1, T2>. 下面的示例中声明了一个Holder类, 它的item域可以存储任意类型的引用.


在Java 7之前必须在创建实例时指定类型参数:


Java 7提供了类型推断功能, 可以根据声明推断实例的类型参数:


或者在return时推断类型:


示例中的Holder类没有对类型参数T做任何限制, T可以实例化为任意类型. Java允许我们限制对其进行限制.


比较常用的是extends限定, 因为子类必然定义了父类的方法(和域), 因此我们可以安全地访问父类声明的方法(和域).


下面的示例中访问item.length()是安全的, 因为T的基类String定义了该方法.


Java也允许只为方法而非整个类声明类型参数:


在上文示例中, 我们总是在实例化泛型类时指定具体的类代替类型参数, 比如Holder<String>使用String代替类型参数T.


类型通配符允许在实例化泛型类时不指定具体类:


上述示例初始化了一个没有类型限制的Holder实例. 无任何限制的类型通配符可以被省略:


除非因为绝对必要的原因, 否则不建议使用无限制的类型通配符. 类型通配符同样可以使用extendssuper进行范围限定.


上述示例中, holderset方法不能正常编译. 类型通配符通常用于声明方法的参数类型:


java的泛型采用运行时类型擦除的方式实现泛型, 也就是说类型参数仅存在于编译期, 运行时虚拟机并不知道泛型参数的存在.


上文示例输出true, 说明了运行期无法访问类型参数. 泛型是通过编译时添加了类型检查和自动转型的字节码来实现的.


数组也受到了类型擦除影响:


上面的代码是可以正常运行的, 但是Java禁止直接创建泛型数组:


禁止创建泛型数组的原因可以在Java Language Specification中窥见端倪:


10.6 数组初始化中提到


看一下reifiable(物化)的定义:


因为类型擦除的原因, java.util.ArrayList采用了Object[]来存储元素.


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java8 ArrayList源码分析 下一篇Java反射详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目