Java核心技术知识点笔记—泛型程序设计(一)

前言:使用泛型机制编写的代码,比杂乱地使用Object变量,而后再强制转换类型的代码,具有更好的安全性和可读性。泛型程序设计(Generic programming)意味着编写的代码可以被很多不同类型的对象所重用。

1、类型参数(type parameters):为何使用泛型程序设计?以ArrayList来探讨。在Java中增加泛型类之前,ArrayList维护的是一个Object引用的数组,类似:

public class ArrayList {
    private Object[] elementData;
    ...
    public Object get(int i) {...}

    public void set(Object o) {...}
}

如此,在使用的时候会有两个问题:

(1)在获取一个值时需要强制类型转换:

        ArrayList list = new ArrayList();
        Object o = list.get(0);
        String str = (String) o;

(2)没有类型检查:

在添加元素时,可以向列表中添加任意类型的对象。如此,当在其他地方获取值的时候,由于需要如(1)的强制转换,很容易就会产生一个类型转换错误的异常。

对上面两个问题,泛型提供的类型参数提供了很好的解决方案。ArrayList类通过一个类型参数来指示元素的类型:

ArrayList list = new ArrayList<>();

如此,代码获得了很好的可读性。在使用的时候也更加安全。

类型参数的魅力正在于此,使程序具有更好的可读性和安全性。

2、定义简单的泛型类:

一个泛型类(generic class)就是具有一个或多个类型变量的类,其定义方法如下:

public class TestGenericC {
    private T first;

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }
}

如上,类型变量T通过尖括号括起来放在类名后面,如此定义了一个泛型类TestGenericC。类型变量可以有多个,使用逗号分隔,用于指定方法的返回类型以及域和局部变量的类型。

3、类型变量:

(1)类型变量使用大写形式,且比较短。在Java库中,使用E表示集合的元素类型,K和V分表表示表的关键字与值的类型,T(需要时也可用临近的U和S)表示“任意类型”。

(2)类型变量的限定:有时,需要确信类型变量属于某个特定的类,此时,可以对类型变量做一个限定,通过使用extends关键字。

public class TestGenericC {
    private T first;

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }
}

观察上述代码,类型变量T后面加上了extends Comparable & Serializable,这就对T做出了限定。一个类型变量可以有多个限定,多个限定类型之间用&分隔。

你可能感兴趣的:(Java,java,泛型)