正如标题所示,我试图设计一个自定义数据结构SearchTree
,对于SearchTree.Entry<K, V>
等条目,该数据结构需要为Iterable
。 A SearchTree
本身只是一个界面。接口及其子类及其类型和子类型的泛型迭代器
我想要做的是有一个与它自己的K
和V
亚型实现SearchTree<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
的类的返回混凝土迭代器实现,以使泛型类型也可以被子类化?
放下'?来自“可比较的 super K>”的超级。将一个对象与它的超类型的一个实例进行比较是没有任何意义的。 –