以FixedCapacityOfString为例学泛型设计

本文介绍如何使用Java泛型来实现一个通用的定容栈。通过泛型的应用,可以使一个类能够处理多种数据类型,避免了为每种类型重复编写相似的代码。文章详细解释了泛型数组的创建过程及注意事项。

如果我们设计一个类,比如说设计一个定容栈(FixedCapacityOfString),则它只能处理特定类型的数据。比如定容栈FixedCapacityOfString只能处理String类型的数据,若想让它处理double数据呢?我们就需要重新用类似的代码重新设计一个类,也就是将String都换成double,有点麻烦!Java中的泛型就可以不用这么麻烦的解决这个问题。
我们可以用下面的代码声明一个类:

public class FixedCapacityStack<Item>

Item是一个类型参数,用于表示用例将会使用的具体数据类型的象征性的占位符。可以将FixedCapacityStack理解为某种元素的栈。在实现此类时,我们并不知道Item的实际类型,但用例只要能在创建类时提供具体的数据类型,它就能用此类处理任意的数据类型。实际的类型必须是引用类型,但用例可以依靠自动装箱将原始数据类型转换成相应的封装类型。Java会使用类型参数Item来检查类型不匹配的错误—–尽管具体的数据类型还不知道,赋予Item类型变量的值也必须是Item类型的。在这里一个细节非常重要:我们希望用以下代码在FixedCapacityStack的构造函数的实现中创建一个泛型的数组:

a = new Item[cap];

创建泛型数组在Java中不被允许的。 我们需要使用类型转换:

a = (Item[]) new Object[cap];

这段代码才能达到我们想要的效果(但Java编译器会给出一条警告(类型安全:未经检查的从 Object[] 到 Item[] 的强制类型转换),不过可以忽略它)。
定容栈FixedCapacityStack的具体实现:

public class FixedCapacityStack<Item> {
    private Item[] a;//stack entries
    private int N;//size

    public FixedCapacityStack(int cap){
        a=(Item[]) new Object[cap];
    }

    public boolean isEmpaty(){
        return N==0;
    }

    public int size(){
        return N;
    }

    public void push(Item item){
        a[N++]=item;
    }

    public Item pop(){
        return a[--N];
    }
}

摘自《Algorithms Fourth Edition》Robert Sedgewick, Kevin Wayne(著);                 谢路云(译)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值