タイトルには、SearchTree.Entry<K, V>
のような項目の上にIterable
である必要があるカスタムデータ構造SearchTree
を設計しようとしています。 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
以上のオブジェクトを反復処理する必要があり、それが何かとしてそれを宣言するために理にかなってlike:
BSTIterator.java
public class BSTIterator<K extends Comparable<? super K>, V> implements Iterator<BSTNode<K, V>> {
}
しかし、すぐに戻って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<>();
}
}
そして今
BST.java BSTIteratorの型引数を推定できません<>です。 この問題を回避するための賢明な方法はありますか?そのため、インターフェイスにジェネリックイテレータを持たせて、SearchTree
を実装しているクラスの具体的なイテレータの実装をジェネリック型をサブクラス化できるようにしますか?
'? 「比較可能 super K>」の「スーパー」となります。オブジェクトをそのスーパータイプのインスタンスと比較することは今までのところ意味がありません。 –