Вы смешиваете объявление типа и использование типа:
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> {...}