深入理解java泛型
前言
什么是泛型
泛型是Java SE5的新特性,泛型的提出是为了编写重用性高的代码。在《Java核心技术》中,泛型的定义为:
"泛型"意味着编写的代码可以被不同类型的对象所重用。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们定义一个类属性或者实例属性时,往往要指定具体的类型,如Integer、Person等等, 但是如果使用了泛型,我们把这些具体的类型参数化,用一个广泛的可以表示所有类型的"类型"T来定义,那这个T就是泛型的表示。
为什么要引入泛型
在引入泛型之前,想要实现一个通用的,可以处理不同类型的方法,需要使用Object作为属性和方法参数。
比如这样:
public class Generic{
private Object[] mData;
public Generic(int capacity){
mData = new Object[capacity];
}
public Object getData(int index){
return mData[index];
}
public void add(int index, Object item){
mData[index] = item;
}
}
它使用一个Object数组来保存数据,这样在使用时可以添加不同类型的对象。
Generic generic = new Generic(10);
generic.add(0,"jieshou");
generic.add(1,2);
然而由于Object是所有类的父类,所有的类都可以作为成员被添加到上述类当中。当需要使用的时候,必须进行强制类型转换,而且这个强转可能会出现异常:
String item1 = (String) generic.getData(0);
String item2 = (String) generic.getData(1);
//报错
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at net.sxkeji.shixinandroiddemo2.test.generic.GenericTest.getData(GenericTest.java:46)
可以看到,使用Object来实现通用、不同类型的处理,有两个缺点:
- 每次在使用时都需要强制转换成对应的类型
- 在编译时编译器并不知道类型转换是否正常,运行时才会知道,并不安全
引入泛型的主要目标
有以下几点:
- 类型安全
- 泛型的主要目标是提高Java程序的类型安全
- 编译时期就可以检查出因Java类型不正确导致的ClassCastException异常
- 符合越早出错代价越小
- 消除强制类型转换
- 泛型在使用时可以直接得到目标类型,从而消除强制类型转换
- 使得代码可读性变高,减少出错机会
- 潜在的性能收益
- 支持泛型几乎不需要JVM或类文件更改
- 所有工作都要在编译器中完成
- 编译器生成的代码跟不使用泛型时所写的代码几乎一致,只是更能确保类型安全而已
泛型的使用方式
泛型的本质是参数化类型,类型参数的意义是告诉编译器是这个集合中要存放实例的类型,从而在添加其他类型时做出提示,在编译期间就为类型安全做了保证。
这种参数类型可以用在类、接口、方法的创建中,分别被称为泛型类、泛型接口、泛型方法。

浙公网安备 33010602011771号