正如標題所示,我試圖設計一個自定義數據結構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>」的超級。將一個對象與它的超類型的一個實例進行比較是沒有任何意義的。 –