Generics (泛型)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daicooper/article/details/80934713

Generics 是 JDK 5.0 新增加的功能,在使用集合时,提供了一种编译时类型安全检查功能,并能减少类型强制转化的麻烦。

当从一个集合中取出一个元素时,例如使用 Iterator 接口中的 next() 方法,其返回值的类型是 Object 。在使用这个元素时,需要把返回值转换为元素本身的类型。这种类型转化是不安全的,因为在编译时不能进行类型检测,在运行时就可能发生异常。

ArrayList a = new ArrayList();
a.add(new Integer(1));
a.add(new Integer(2));
for(Iterator i = a.iterator(); i.hasNext(); ){
    int i1 = ((Integer)i.next()).intValue();
}

程序中 集合 a 中存储的是 Integer 类型的元素, next() 方法返回的是 Object 类型,需要把返回类型强制转化为 Integer 类型。

当 java 5.0 引入泛型后,集合框架中的大部分类和接口都增加了泛型类型声明,引入了一个名字为 E 的类型变量,例如:public class ArrayList < E > 。只要 把 E看做特殊类型的变量就可以了,它的值将是传递过来的任何类型的引用类型。在自己 的代码中引用泛型类,必须执行泛型类型的对象,并没有创建新的类。

泛型类型的调用通常被称为 参数化类型,为了实例化这个类,需要在类名称和括号之间加上 < Integer >。
上面的程序可以改写为:

ArrayList < Integer > a = new ArrayList < Integer > ();
a.add(new Integer(1));
a.add(new Integer(2));
for(Iterator < Integer > i = a.iterator(); i.hasNext();){
    int il = i.next().intValue();
}

代码中的 ArrayList < Integer > 指明了集合 a 中存储的元素的类型是 Integer。在通过 iterator 访问集合中的元素时,指明迭代器访问的元素类型,如下面的代码:

Iterator < Integer > i = a.iterator();

在具体的访问元素时,就不需要进行类型转化,如下面的代码:

int il = i.next().intValue();

使用 generics 可以清楚不安全的类型转化,省去了进行类型转换的代码,并在编译时进行类型检查,编译器认为 next() 方法返回的类型是元素的实际类型。在上面的程序中能够在编译时判断所调用的 intValue() 方法是否是元素类型中的方法。

Generics 是通过 “类型清楚(Type Erasure)” 实现的。 generics 的类型信息只在编译时存在,由编译器根据 generics 信息生成强制类型转化代码,编译成 class 文件后,就被编译器清除了。 这样能够保证强制类型转化是安全的。

用户也可以创建自己的泛型类型。

import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList <Integer> a = new ArrayList<Integer>();
        int sum = 0;
        a.add(new Integer(1));
        a.add(new Integer(2));
        for(Iterator <Integer> i = a.iterator(); i.hasNext();){
            sum += i.next().intValue();
        }
        System.out.println(sum );
    }  
}
// 3

猜你喜欢

转载自blog.csdn.net/daicooper/article/details/80934713