美文网首页
优先考虑泛型

优先考虑泛型

作者: 没走过的二丁目 | 来源:发表于2018-07-26 15:55 被阅读0次

一般来说,将集合声明参数化,使用JDK提供的泛型或者泛型方法都不困难,,编写自己的泛型会比较困难一些,但是值得花时间去学习如何编写。
考虑之前的一个例子,堆栈的实现

// Initial attempt to generify Stack = won't compile!
public class Stack<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    
    public Stack() {
        elements = new E[DEFAULT_INITIAL_CAPACITY];//error
    }
 
    public void push(E e) {
        ensureCapacity();
        elements[size++] = e;
    }
 
    public E pop() {
        if (size == 0)
            throw new EmptyStackException();
        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);
    }
}

如25条所述,你不能创建不可具化的类型数组,每当编写用数组支持的泛型时,都会出现这个问题。解决办法有两个
1.直接绕过创建泛型数组的禁令:创建一个object的数组,直接将它转化成泛型数组类型。现在错误消除了,但是又会出现一条警告

 elements = (E[])new Object[DEFAULT_INITIAL_CAPACITY];

warnings:[unchecked] cast found object[] ,required e[]
编译器不可能证明你的程序是类型安全的,但是你可以证明。你自己必须确保未受检查的转换不会危及到程序的安全性。这个数组中保存的唯一元素,是传给push方法的那些元素,他们的类型是E,因此是绝对安全,不会发生转换异常的,一旦证明了这点就需要尽可能小的范围去消除警告,代码如下

@SuppressWarnings("unchecked")
    public Stack() {
       // elements = new E[DEFAULT_INITIAL_CAPACITY];
        elements = (E[])new Object[DEFAULT_INITIAL_CAPACITY];
    }

2.将elements的类型变成object[],这个时候回遇到新的异常


image.png

解决方法:

 public E pop() {
        if (size == 0)
            throw new EmptyStackException();
        @SuppressWarnings("unchecked")
        E result = (E)elements[--size];
        elements[size] = null;
        return result;
    }

这里就没有必要在方法上加注解!!

总之,使用泛型比使用需要在客户端代码中进行转化的类型来的更安全。也更容易,在设计新类的时候,要确保它们不需要这种转换就可以使用。这通常意味着要把类做成是泛型的。

相关文章

  • [Effective Java] Item 27: Favor

    类似于Item 26里优先考虑泛型,Item 27告诉我们要优先考虑泛型方法。 编写泛型方法和编写泛型类相似。泛型...

  • 优先考虑泛型

    一般来说,将集合声明参数化,使用JDK提供的泛型或者泛型方法都不困难,,编写自己的泛型会比较困难一些,但是值得花时...

  • 《 Effective Java》关于泛型,方法和枚举,注解的建

    泛型 27.优先考虑泛型方法28.利用有限制通配符来提高API的灵活性29.优先考虑类型安全的异构容器 枚举 30...

  • 第五章泛型

    目录 不要使用原始类型 消除非检查警告 列表优于数组 优先考虑泛型 优先使用泛型方法 使用限定通配符来增加API的...

  • 优先考虑泛型方法

    就如类可以从泛型中收益一般,方法也一样。静态工具方法尤其适合于泛型化。collections中的所有“算法”方法(...

  • 第26条:优先考虑泛型

    public class Stack { private Object[] elements; private ...

  • 第 29 条:优先考虑泛型

    未使用泛型 使用泛型第一种 使用泛型第二种

  • TypeScript 06 - 泛型

    基本示例 使用泛型变量 泛型类型 泛型类 泛型约束 1. 基本示例 考虑到组件的可重用性,引入了泛型的概念,可以使...

  • 第27条 优先考虑泛型方法

    考虑如下的方法,它的作用是返回两个集合的联合: 这个方法可以编译,但是有三条警告: 有道翻译:-类型安全:构造函数...

  • 第 30 条:优先考虑泛型方法

    类型推导 泛型单例工厂 递归类型限制

网友评论

      本文标题:优先考虑泛型

      本文链接:https://www.haomeiwen.com/subject/voopmftx.html