我正在通过编写二进制树来学习Iterator类的实现,该树使用该类作为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;
}
}
答案 0 :(得分:3)
您混合类型声明和类型使用:
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> {...}
一般情况下,如果你想要一个类实现一个通用接口,而它本身就是一个泛型类,你可以转发&#34;类中的泛型类型使它在以下两者中保持相同:
public class BSTreeIterator<T> implements Iterator<T> {...}
答案 1 :(得分:2)
泛型类型的名称无关紧要,但您必须通过指示如何将已实现接口的类型与类相关联来帮助编译器。选择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;
}
您获得的编译器错误是因为您在E
方法中返回next()
,但未在E
类中定义BSTreeIterator
泛型。
答案 2 :(得分:0)
您需要迭代与BSTreeIterator
类型相同类型的元素,因此请更改
public class BSTreeIterator<T> implements Iterator<E> {
到
public class BSTreeIterator<T> implements Iterator<T> {
答案 3 :(得分:-1)
您正在混合使用Java泛型类型标识符。
首先尝试实施该课程。
public class BSTreeIterator implements Iterator<String>
一旦你弄清楚如何做到这一点, 将通用运算符添加到BSTreeIterator。 该课程将如下所示:
public class BSTreeIterator<ElementType> implements Iterator<ElementType>
这是常见的, 懒惰练习使用一个字符值作为泛型类型名称 (在你的例子中为E)。 我建议不要使用惰性开发实践。