Java学习笔记08 泛型
来源:互联网 发布:快速排序算法最坏情况 编辑:程序博客网 时间:2024/05/17 02:43
1.概述
JDK1.5版本以后的新特性。用于解决安全问题,是一种安全机制。
好处:
将运行时期出现的问题ClassCastException转移到了编译时期,方便于程序员解决问题。让运行时期问题减少。更加的安全。
泛型技术其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了(泛型的擦除)。也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。避免了强制类型转换的麻烦。可以知道获取的元素类型而不用强转换。
泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。
2.泛型的格式
通过<>来定义要操作的引用数据类型。只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给<>中传递一个具体的引用数据类型。这在集合框架中很常见,当使用集合时,将集合中要存储的元素的数据类型作为参数,传递到<>中即可。
3.泛型类、接口和泛型方法
当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。
泛型类定义的泛型在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有方法要操作的类型就已经固定了。为了让不同的方法可以操作不同的类型,而且类型还不确定,那么可以将泛型定义在方法上,即为泛型方法。如代码示例:
class Tool<Q> //将泛型定义在类上{ private Q obj; public void setObject(Q obj) { this.obj = obj; } public Q getObject() { return obj; } public <W> void method(W w) //将泛型定义在方法上 { System.out.println("method:"+w); }}interface Inter<T> //泛型接口{ void show(T t);}class InterImpl<R> implements Inter<R> { public void show(R r) { System.out.println("show:"+r); }}
注意:
- 格式:写在返回类型前,修饰符后面。
- 静态方法 不可以返回类上定义的泛型。如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。静态方法的泛型一定定义在方法上。
4.泛型限定
< ? > : 通配符(也叫占位符),表示任意类型。当操作类型时,具体类型不确定,不需要使用类型的具体功能,只使用Object类中的功能时,那么可以用 < ? > 通配符来表未知类型。
< ? extends E> :上限限定,可以接收E类型或者E的子类型对象。
当方法内要调用某个特定的方法时,可以设定上限E,因为E和E的子类都具有该方法。
< ? super E>:下限限定,可以接收E类型或者E的父类型对象。
当方法被调用时,会传入的参数为某个特定类型的对象,该方法可以使用下限限定。因为E类型或者E的父类类型都可以接收E类型的对象作为实参。
泛型的细节:
1. 泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型。
2. 使用带泛型的类创建对象时,等式两边指定的泛型必须一致。
原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了。
3. 等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容)。如:
ArrayList<String> al = new ArrayList<Object>(); //错//要保证左右两边的泛型具体类型一致。ArrayList<? extends Object> al = new ArrayList<String>();al.add("aa"); //错/*因为集合具体对象中既可存储String,也可以存储Object的其他子类,所以添加具体的类型对象不合适,类型检查会出现安全问题。<?extends Object> 代表Object的任意子类型,不能添加具体类型的对象。*/public static void method(ArrayList<? extends Object> al) { al.add("abc"); //错 //只能对al集合中的元素调用Object类中的方法,具体子类型的方法都不能用,因为子类型不确定。}
- java学习笔记08--泛型
- Java学习笔记08 泛型
- Java学习笔记(泛型)
- java学习笔记-泛型
- Java学习笔记: 泛型
- 【java学习笔记】泛型
- Java学习笔记-泛型
- JAVA-泛型-学习笔记
- 【Java学习笔记】泛型
- Java泛型--学习笔记
- Java学习笔记---泛型
- java 泛型 学习笔记
- 【JAVA】泛型 学习笔记
- java学习笔记08
- java学习笔记-08
- JAVA学习笔记-08
- java学习笔记-java泛型
- JAVA学习笔记-------泛型,约束
- oracle 数据库rman+crontab自动差异增量备份
- iOS面试题及答案
- android学习历程,自定义listview并从服务器端获取数据填充进listview
- 1394 - And Then There Was One(约瑟夫问题变形)DP
- c++生成随机数
- Java学习笔记08 泛型
- VC下静态链接库与动态链接库
- 为什么数据库有的大有的小?
- Mac系统变量
- java即时通信,推送技术详解
- hadoop+maven工程伪分布下实例运行
- 那些值得学习的精美邮件模板案例
- 贪吃的CWT loser题解
- iOS选择照片、相册问题