• 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());
            }
        }

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

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

  • 相关阅读:
    Mac 快速进入mysql命令行
    Vuex 的使用 State Mutation Getter Action
    Vuex状态管理
    路由模块化
    Vue中路由的嵌套
    Vue路由编程式导航以及hash模式
    Vue动态路由 Get传值
    Vue中的路由 以及默认路由跳转
    Vue非父子组件传值
    父组件主动获取子组件的数据和方法 和 子组件主动获取父组件的数据和方法
  • 原文地址:https://www.cnblogs.com/qwop/p/6637281.html
Copyright © 2020-2023  润新知