我正在通过编写一个二叉树来学习迭代器类的实现,该二叉树使用此类作为java.util.AbstractCollections
的迭代器。但是,我不确定应该如何使用类声明中的<E>
。我对<T>
符号有点熟悉,但不幸的是,我无法找到关于如何使用它以及为什么它存在的良好解释。我已经去过Java 8文档了。
当我尝试编译它时,编译器会产生Cannot resolve symbol "E"
import java.util.Iterator;
public class BSTreeIterator<T> implements Iterator<E> {
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
混合类型声明和类型使用:
public class BSTreeIterator<T> implements Iterator<E> {...}
^--- type declaration ^--- type use
同样,这也是一个类型声明和类型使用:
public <T> T (T object){
^ ^--^-- type uses
|-- type declaration
}
您的问题是编译器接受T
因为可以使用任何有效标识符声明类型,并且T
这样做。但它不接受E
因为不能使用不退出的类型。
你可以声明一个类型并使用另一个类型,但这没有意义:
public class BSTreeIterator<E> implements Iterator<String> {...}
通常,由于您希望类实现泛型接口,同时本身是泛型类,因此您将类中的泛型类型"转发"以使其在两者中保持相同,例如:
public class BSTreeIterator<T> implements Iterator<T> {...}
泛型类型的名称无关紧要,但您必须通过指示如何将实现的接口的类型与类相关联来帮助编译者。 选择E
或T
。由于您似乎对T
有偏好,因此您应该将其用作BSTreeIterator<T> implements Iterator<T>
,因此编译器知道T
泛型既适用于相同又可替换。
public class BSTreeIterator<T> implements Iterator<T> {
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
return null;
}
您得到的编译器错误是因为您在next()
方法中返回E
,但您没有在BSTreeIterator
类上定义E
泛型。
您需要迭代与给定BSTreeIterator
的类型相同类型的元素,因此请更改
public class BSTreeIterator<T> implements Iterator<E> {
自
public class BSTreeIterator<T> implements Iterator<T> {
你混淆了Java泛型类型标识符。
首先尝试实现该类。
public class BSTreeIterator implements Iterator<String>
一旦你弄清楚了如何做到这一点, 将泛型运算符添加到 BSTreeIterator。 该类将如下所示:
public class BSTreeIterator<ElementType> implements Iterator<ElementType>
这是一个常见的, 对泛型类型名称使用一个字符值的懒惰做法 (在您的示例中为 E(。 我建议不要懒惰的开发实践。