为何同时使用extends与implement?泛型中extends Comparable的原因
关于二叉搜索树泛型与接口实现的疑问解答
先把你给出的代码贴出来方便参考:
class BinarySearchTree <T extends Comparable<T>> implements Iterable<T> { private Node<T> root; public void add(T data) { Node<T> p = new Node<T>(data); if (root == null) { root = p; } else { root.addNode(p); } }
一、为什么同时用extends和implements?
这俩关键字干的完全是两码事,根本不冲突:
<T extends Comparable<T>>里的extends是给泛型参数T加类型约束——意思是你往这个二叉搜索树里存的元素类型T,必须是实现了Comparable<T>接口的(或者是它的子类),这样元素之间才能互相比较大小,这是BST能正常工作的基础。implements Iterable<T>是让BinarySearchTree这个类本身实现Iterable接口,这样你就能用增强for循环(for(T item : bst))来遍历树里的元素,这是给类加遍历的能力。
一个管的是“存的东西得满足啥条件”,一个管的是“这个类本身得具备啥能力”,所以同时用完全合理。
二、为什么是T extends Comparable<T>,而不是让BinarySearchTree直接实现Comparable<T>?
咱们得先想明白:二叉搜索树需要比较的是什么?
BST的核心逻辑是根据元素的大小来决定插入、查找的位置——比如插入一个新元素时,要和当前节点的元素比大小,小的往左子树放,大的往右子树放。这就要求每个元素自己能和同类型的元素比较,所以必须让元素类型T实现Comparable<T>,这样才能调用compareTo方法做大小判断。
如果写成class BinarySearchTree <T> implements Iterable<T>, Comparable <T>,那意思就变成“两个BinarySearchTree对象之间可以比较大小”,这完全不是我们需要的功能啊!比如你没法用树对象的compareTo来判断一个元素该插在树的哪个位置,这完全搞错了比较的主体。
说白了,BST需要的是“元素可比较”,而不是“树本身可比较”,所以约束泛型T才是正确的做法。
内容的提问来源于stack exchange,提问作者Max K
相关产品推荐
相关产品推荐

