Comme le titre le dit, j'essaie de concevoir une structure de données personnalisée SearchTree
qui devrait être Iterable
sur les entrées telles que SearchTree.Entry<K, V>
. Un SearchTree
lui-même est juste une interface.Itérateur générique pour une interface et ses sous-classes et ses types et sous-types
Ce que je veux faire est d'avoir que toute classe qui implémente SearchTree<K, V>
avec ses propres sous-types de K
et V
est également en mesure de mettre en œuvre le iterator tel que défini dans une interface 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);
}
}
Et supposons maintenant que j'ai une classe qui implémente l'interface.
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> { // ...
}
Maintenant, évidemment, le BST Iterator
doit itérer sur BSTNode
objets, donc il serait logique de le déclarer comme quelque chose comme:
BSTIterator.java
public class BSTIterator<K extends Comparable<? super K>, V> implements Iterator<BSTNode<K, V>> {
}
Mais revenons au problème de BST.java
où l'instance de BSTIterator
doit être retourné quelque chose comme:
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<>();
}
}
Et maintenant cela ne fonctionne pas: Impossible de déduire des arguments de type pour BSTIterator <>. Y a-t-il un moyen sensé de contourner ce problème, de sorte que je puisse avoir un itérateur générique dans mon interface, et un retour des implémentations d'itérateur concret des classes implémentant le SearchTree
de manière à ce que les types génériques puissent aussi être sous-classés?
Supprimer le '? super' de 'Comparable super K>'. Cela n'a jamais de sens de comparer un objet à une instance de son supertype. –