算法(4th ed)(116):基础——背包、队列和栈 5.1.1

阅读数:31 2019 年 11 月 2 日 12:27

算法(4th ed)(116):基础——背包、队列和栈 5.1.1

(API:泛型)

集合类的抽象数据类型的一个关键特性是我们应该可以用它们存储任意类型的数据。一种特别的 Java 机制能够做到这一点,它被称为泛型,也叫做参数化类型。泛型对编程语言的影响非常深刻,许多语言并没有这种机制(包括早期版本的 Java)。在这里我们对泛型的使用仅限于一点额外的 Java 语法,非常容易理解。在每份 API 中,类名后的<Item> 记号将 Item 定义为一个类型参数,它是一个象征性的占位符,表示的是用例将会使用的某种具体数据类型。可以将Stack<Item> 理解为某种元素的栈。在实现 Stack 时,我们并不知道 Item 的具体类型,但用例可以用我们的栈处理任意类型的数据,甚至是在我们的实现之后才出现的数据类型。在创建栈时,用例会提供一种具体的数据类型:我们可以将Item 替换为任意引用数据类型(Item 出现的每个地方都是如此)。这种能力正是我们所需要的。例如,可以编写如下代码来用栈处理 String 对象:

复制代码
Stack<String> stack = new Stack<String>();
stack.push("Test");
...
String next = stack.pop();

并在以下代码中使用队列处理 Date 对象:

复制代码
Queue<Date> queue = new Queue<Date>();
queue.enqueue(new Date(12, 31, 1999));
...
Date next = queue.dequeue();

如果你尝试向 stack 变量中添加一个 Date 对象(或是任何其他非 String 类型的数据)或者向 queue 变量中添加一个 String 对象(或是任何其他非 Date 类型的数据),你会得到一个编译时错误。如果没有泛型,我们必须为需要收集的每种数据类型定义(并实现)不同的 API。有了泛型,我们只需要一份 API(和一次实现)就能够处理所有类型的数据,甚至是在未来定义的数据类型。你很快将会看到,使用泛型的用例代码很容易理解和调试,因此全书中我们都会用到它。

评论

发布