Effective Java学习--第26条:优先考虑泛型

本文详细介绍了如何将普通堆栈类转换为使用泛型的版本,通过实例化未知类型的泛型数组来解决初始化问题,并探讨了两种不同强转方式的优劣,最终建议遵循泛型优先原则,减少数组使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一个简单,未使用泛型实现的堆栈。

public class MyStack {

    private Object[] elements;
    private int size;
    public static final int DEFAULT_INITIAL_CAPACITY = 16;

    public MyStack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object o){
        ensureCapacity();
        elements[size++]=o;
    }

    public Object pop(){
        if(size == 0){
            throw new EmptyStackException();
        }
        Object result = elements[--size];
        elements[size] = null;//手动垃圾回收
        return result;
    }

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

}

尝试修改为泛型版本,第一步将Object全部替换为E

public MyStack2() {
        elements = new E[DEFAULT_INITIAL_CAPACITY];
}

在这一步报错了,原来,不能初始化一个未知类型的泛型数组。ef提供了两种解决方案。

方案一:

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

注意消除类型未检查警告。

方案二:

private Object[] elements;
public MyStack2() {
    elements =  new Object[DEFAULT_INITIAL_CAPACITY];
}

pop:
E result = (E)elements[--size];

两种各有其优势,前者在声明时强转,后者在取出时强转。这个根据具体需求而定,前者更危险,后者更耗时。其实个人感觉数组操作,区别也不是那么的大。

根据25条(泛型–列表优先于数组)的建议,能避免使用数组的地方,就避免吧,毕竟数组是协变(covariant)的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值