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

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

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

  • 相关阅读:
    WebDriverException:Message:'geckodriver'executable needs to be in Path
    如何使用NSDL玩转微信跳一跳
    python多线程下载网页图片并保存至特定目录
    sql之将一个表中的数据注入另一个表中
    sql之分区域分段统计
    sql之分段统计
    ajax二次封装之异步加载
    vue组件之echarts报表
    url查询参数解析
    template.js 数据渲染引擎
  • 原文地址:https://www.cnblogs.com/qwop/p/6637281.html
Copyright © 2020-2023  润新知