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遍历
?超级
来自
可比