Java Iterator Class - не удается разрешить символ "E" - PullRequest
0 голосов
/ 22 мая 2018

Я узнаю о реализации класса итераторов, программируя двоичное дерево, которое использует этот класс в качестве итератора для 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 ]

0 голосов
/ 22 мая 2018

Вам нужно будет выполнить итерацию элементов того же типа, что и тип, заданный для BSTreeIterator, поэтому измените

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

на

public class BSTreeIterator<T> implements Iterator<T> {
0 голосов
/ 22 мая 2018

Вы смешиваете идентификаторы универсального типа Java.

Сначала попробуйте реализовать класс.

public class BSTreeIterator implements Iterator<String>

Как только вы поймете, как это сделать, добавьте оператор универсального типа в BSTreeIterator.Этот класс будет выглядеть примерно так:

public class BSTreeIterator<ElementType> implements Iterator<ElementType>

Обычной ленивой практикой является использование односимвольного значения в качестве имени универсального типа (E в вашем примере).Я рекомендую против ленивых методов разработки.

0 голосов
/ 22 мая 2018

Вы смешиваете объявление типа и использование типа:

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> {...}     
0 голосов
/ 22 мая 2018

Имя универсального типа не имеет значения, но вы должны помочь компилятору, указав, как связать тип реализованного интерфейса с классом.Либо выберите 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.

...