泛型的应用——容器类

一个堆栈类

LinkList本身已经具备了创建堆栈所必需的方法,而Stack本身可以通过两个泛型类Stack<T>LinkedList<T>的组合创建。

我们可以不使用LinkList,来实现自己的内部链式存储机制。

public class LinkedStack<T> {
    private static class Node<U> {
        U item;
        Node<U> next;

        public Node() {
            item = null;
            next = null;
        }

        public Node(U item, Node<U> next) {
            this.item = item;
            this.next = next;
        }

        boolean end() {
            return item == null && next == null;
        }
    }

    private Node<T> top = new Node<>();

    public void push(T item) {
        top = new Node<>(item, top);
    }

    public T pop() {
        T result = top.item;
        if (!top.end()) {
            top = top.next;
        }
        return result;
    }

    public static void main(String[] args) {
        LinkedStack<String> lls = new LinkedStack<>();
        for (String s : "Phasers on stun!".split(" ")) {
            lls.push(s);
        }
        String s;
        while ((s = lls.pop()) != null) {
            System.out.println("s = " + s);
        }
    }
}
// Outputs
s = stun!
s = on
s = Phasers

内部类Node也是一个泛型,它也拥有自己的类型参数。
这个例子用到了末端哨兵,在堆栈的最底部创建一个itemnext都为空的对象,如果堆栈已经只剩末端哨兵,那么将不在移动取值。

RandomList

作为容器的另一个例子,假设我们需要一个持有特定类型对象的列表,每次调用其select()方法的时候,可以随机选取一个元素,并且希望构建一个可以运用于各种类型的对象的工具,那么就应当泛型。

public class RandomList<T> {
    private ArrayList<T> storage = new ArrayList<>();
    private Random rand = new Random(47);

    public void add(T item) {
        storage.add(item);
    }

    public T select() {
        return storage.get(rand.nextInt(storage.size()));
    }

    public static void main(String[] args) {
        RandomList<String> rs = new RandomList<>();
        for (String s : ("The quick brown fox jumped over " + "the lazy brown dog").split(" ")) {
            rs.add(s);
        }
        for (int i = 0; i < 11; i++) {
            System.out.print(rs.select() + " ");
        }
    }
}
// Outputs
brown over fox quick quick dog brown The brown lazy brown 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章将会介绍 泛型所解决的问题泛型函数类型参数命名类型参数泛型类型扩展一个泛型类型类型约束关联类型泛型 Where...
    寒桥阅读 655评论 0 2
  • Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可...
    Bobby0322阅读 14,188评论 0 26
  • 泛型(Generics) 泛型代码允许你定义适用于任何类型的,符合你设置的要求的,灵活且可重用的 函数和类型。泛型...
    果啤阅读 704评论 0 0
  • 泛型代码可以确保你写出灵活的,可重用的函数和定义出任何你所确定好的需求的类型。你的可以写出避免重复的代码,并且用一...
    iOS_Developer阅读 814评论 0 0
  • 早睡早起 锻炼 控制使用网络时间 Remember the Final target For myself For...
    TNANNAN阅读 261评论 0 0