EffectiveJava(26)使用泛型类替代普通类

使用泛型编写类比使用需要在客户端代码中进行转换的类型更加安全,并且对去其他程序员来说更加容易扩展,我们应该将可以用泛型代替的非泛型类优化

那么,如何将类泛型化呢?
这很简单.首先,给他的声明添加一个或者多个类型参数;然后,用相应的类型参数替换所有的Object类型
如:将第六条中的Stack类优化为泛型类
第六条链接:http://blog.csdn.net/jacxuan/article/details/56851123

    public class StackGeneric<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
//消除强制转换的未受检警告
    @SuppressWarnings("unchecked")
    public StackGeneric() {
        //不能创建不可具体化的数组
        //elements = new E[DEFAULT_INITIAL_CAPACITY];
        //1.替换 直接绕过创建数组的禁令  会出现一个unchecked cast 警告
        elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(E e) {
        ensureCapacity();
        elements[size++] = e;

    }

    public E pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        //2.将elements域的类型从E[]改为Object[]
        E result = (E)elements[--size];
        //E result = elements[--size];
        elements[size] = null;
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

测试堆栈中弹出的元素转换为大写的方法

public static void main(String[] args) {
        StackGeneric<String> stack = new StackGeneric<String>();
        for(String arg:args){
            stack.push(arg);
        }
        while(!stack.isEmpty()){
            System.out.println(stack.pop().toUpperCase());
        }
    }

在上一条中,我们鼓励优先使用列表而非数组,但是实际上并不是总能在泛型中使用列表

总结:是用泛型比使用需要在客户端代码中进行转换的类型更加安全,更加容易.在设计新类型的时候,要确保他们不需要这种转换就可以使用.这通常意味着要把类做成泛型的.这对于这些类型的新用户来说会更加轻松,又不会破坏现有的客户端.

原文地址:https://www.cnblogs.com/qwop/p/6637281.html