13 泛型

Java 5之后提供泛型(Generics)支持,使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Java影响最大是集合框架的使用。

对于Java 5之前程序员而言,使用集合经常会面临一个很尴尬的问题:放入一个种特定类型,但是取出时候全部是Object类型,于是在具体使用时候需要将元素转换为特定类型。上述代码第①行取出的元素是Object类型,在代码第②行需要强制类型转换。强制类型转换是有风险的,如果不进行判断就臆断进行类型转换会发生ClassCastException异常。

而泛型的引入可以将这些运行时异常提前到编译期暴露出来,这增强了类型安全检查。

自定义泛型类

public class Queue {                         

    // 声明保存队列元素集合items
    private List items;                      

    // 构造方法初始化是集合items
    public Queue() {
        this.items = new ArrayList();        
    }

    /**
     * 入队方法
     * @param item 参数需要入队的元素
     */
    public void queue(T item) {                 
        this.items.add(item);
    }

    /**
     * 出队方法
     * @return 返回出队元素
     */
    public T dequeue(){                         
        if (items.isEmpty()) {
            return null;
        } else {
            return this.items.remove(0);        
        }
    }

    @Override
    public String toString() {
        return items.toString();
    }

}

自定义泛型接口

自定义泛型接口与自定义泛型类类似,定义的方式完全一样。

泛型方法

在方法中也可以使用泛型,即方法的参数类型或返回值类型,可以用类型参数表示。假设笔者想编写一个能够比较对象大小的方法,实现代码如下:

    // 限定类型参数为Number
    public static  boolean isEquals(T a, T b) {                          ⑥
        return a.equals(b);
    }

另外,泛型的类型参数也可以限定一个边界,例如比较方法isEquals()只想用于数值对象大小的比较,实现代码如下:

    // 限定类型参数为Number
    public static  boolean isEquals(T a, T b) {        ②
        return a.equals(b);
    }

你可能感兴趣的:(13 泛型)