代码之家  ›  专栏  ›  技术社区  ›  valerius21

Java迭代器类不能解析符号“e”

  •  0
  • valerius21  · 技术社区  · 7 年前

    我正在通过编程一个二进制树来学习迭代器类的实现,它使用这个类作为迭代器 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;
        }
    }
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   davidxxx    7 年前

    混合类型声明和类型使用:

    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> {...}     
    
        2
  •  2
  •   M. le Rutte    7 年前

    泛型类型的名称并不重要,但您必须通过指示如何将已实现接口的类型与类关联来帮助编译器。要么选择 E T . 你似乎更喜欢 T 你应该把它当作 BSTreeIterator<T> implements Iterator<T> ,所以编译器知道 T generic用于相同的和可替换的。

    public class BSTreeIterator<T> implements Iterator<T> {
      @Override
      public boolean hasNext() {
        return false;
      }
    
      @Override
      public T next() {
          return null;
      }
    

    您得到的编译器错误是因为您返回 e next() 方法,但您没有定义 e 通用于 BSTreeIterator 班级。

        3
  •  0
  •   Lajos Arpad    7 年前

    您需要迭代与给定类型相同的元素类型 BSTreeIterator ,所以改变

    public class BSTreeIterator<T> implements Iterator<E> {
    

    public class BSTreeIterator<T> implements Iterator<T> {
    
        4
  •  -1
  •   DwB    7 年前

    您正在混合Java泛型类型标识符。

    首先尝试实现类。

    public class BSTreeIterator implements Iterator<String>
    

    一旦你知道怎么做, 将泛型运算符添加到bstreeiterator。 这个类看起来像这样:

    public class BSTreeIterator<ElementType> implements Iterator<ElementType>
    

    这很常见, 对泛型类型名使用一个字符值的懒惰做法 (例如e)。 我建议不要使用懒惰的开发实践。