【发布时间】:2017-10-18 10:27:09
【问题描述】:
正如标题所说,我正在尝试设计一个自定义数据结构SearchTree,它需要在SearchTree.Entry<K, V> 等条目之上为Iterable。 SearchTree 本身只是一个接口。
我想要做的是让任何实现SearchTree<K, V> 及其自己的子类型K 和V 的类也能够实现SearchTree<K, V> 接口中定义的迭代器。
SearchTree.java
public interface SearchTree<K extends Comparable<? super K>, V> extends Iterable<SearchTree.Entry<K, V>> {
static interface Entry<K, V> {
K getKey();
V getValue();
void setValue(V value);
}
}
现在假设我有一个实现接口的类。
BST.java
public class BST<K extends Comparable<? super K>, V> implements SearchTree<K, V> {
@Override
public Iterator<Entry<K, V>> iterator() {
// return some bst specific iterator
}
}
BSTNode.java
public class BSTNode<K extends Comparable<? super K>, V> implements SearchTree.Entry<K, V> { // ...
}
现在,很明显,BST Iterator 应该迭代 BSTNode 对象,因此将其声明为以下内容是有意义的:
BSTIterator.java
public class BSTIterator<K extends Comparable<? super K>, V> implements Iterator<BSTNode<K, V>> {
}
但现在回到BST.java 的问题,BSTIterator 的实例应该返回如下:
BST.java
public class BST<K extends Comparable<? super K>, V> implements SearchTree<K, V> {
@Override
public Iterator<Entry<K, V>> iterator() {
return new BSTIterator<>();
}
}
现在这不起作用:无法推断 BSTIterator 的类型参数。
有什么明智的方法可以解决这个问题,这样我就可以在我的接口中有一个泛型迭代器,并从实现SearchTree 的类中返回具体的迭代器实现,这样泛型类型也可以被子类化?
【问题讨论】:
-
从
Comparable<? super K>中删除? super。将对象与其超类型的实例进行比较是没有意义的。
标签: java generics polymorphism