Java 接口及其子类及其类型和子类型的泛型迭代器
正如标题所说,我正在尝试设计一个自定义数据结构Java 接口及其子类及其类型和子类型的泛型迭代器,java,generics,polymorphism,Java,Generics,Polymorphism,正如标题所说,我正在尝试设计一个自定义数据结构SearchTree,它需要对SearchTree.Entry等条目进行Iterable。SearchTree本身只是一个接口 我想做的是,任何实现了SearchTree的类,以及它自己的K和V子类型,都能够实现SearchTree接口中定义的迭代器 SearchTree.java public interface SearchTree<K extends Comparable<? super K>, V> extends I
SearchTree
,它需要对SearchTree.Entry
等条目进行Iterable
。SearchTree
本身只是一个接口
我想做的是,任何实现了SearchTree
的类,以及它自己的K
和V
子类型,都能够实现SearchTree
接口中定义的迭代器
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);
}
}
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
}
}
public class BSTNode<K extends Comparable<? super K>, V> implements SearchTree.Entry<K, V> { // ...
}
public class BSTIterator<K extends Comparable<? super K>, V> implements Iterator<BSTNode<K, V>> {
}
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
中的问题,其中bstierator
的实例应返回如下内容:
BST.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);
}
}
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
}
}
public class BSTNode<K extends Comparable<? super K>, V> implements SearchTree.Entry<K, V> { // ...
}
public class BSTIterator<K extends Comparable<? super K>, V> implements Iterator<BSTNode<K, V>> {
}
public class BST<K extends Comparable<? super K>, V> implements SearchTree<K, V> {
@Override
public Iterator<Entry<K, V>> iterator() {
return new BSTIterator<>();
}
}
public class BST你很接近了。迭代器b迭代器
必须实现迭代器
,而不是迭代器
。我认为这是因为您返回的迭代器的类型必须保证它是任何条目
,而不是具体的BSTNode
public class BSTIterator<K extends Comparable<? super K>, V>
implements Iterator<SearchTree.Entry<K, V>> {
// ...
}
public class BST<K extends Comparable<? super K>, V>
implements SearchTree<K, V> {
@Override
public Iterator<SearchTree.Entry<K, V>> iterator() {
return new BSTIterator<>();
}
}
有几种方法可以实现这一点
最直接的方法是什么。但这是在丢弃类型信息:例如,如果您想直接使用BSTIterator
,如果您想这样使用它们,则需要将元素强制转换回BSTNode
s
hacky(但实际上是完全安全的)方法是要注意,迭代器
上没有使用者方法:您只能通过get()
(或者检查是否有其他元素,或者删除以前获取的元素)从中获取值
因此,使用迭代器作为迭代器是完全安全的。Java的类型系统不知道它是安全的,因此您必须强制转换:
return (Iterator<SearchTree.Entry<K, V>>) (Iterator<?>) new BSTIterator<K, V>();
这有点恶心,因为现在iterator()
方法将返回一个iterator遍历?超级来自可比