Я считаю, что происходит то, что вы игнорируете аргумент универсального типа, называя InIterator
без ссылки на универсальный тип в сигнатуре (даже если он присутствует в интерфейсе).
Это относится к категории глупых предупреждений компилятора: вы написали класс так, что 100% InIterator
экземпляров будут реализовывать Iterator<E>
, но компилятор не распознает его. (Я полагаю, это зависит от компилятора. Я не вижу предупреждения в моем компиляторе Eclipse, но я знаю, что компилятор Eclipse обрабатывает генерики немного иначе, чем компилятор JDK.)
Я утверждаю, что это менее понятно и менее близко к тому, что вы имеете в виду, но, возможно, более дружественно к компилятору и в конечном итоге эквивалентно:
public class Stuff<E> {
Iterator<E> foo() {
class InIterator<F> implements Iterator<F> {
@Override public boolean hasNext() { return false; }
@Override public E next() { return null; }
@Override public void remove() { }
}
return new InIterator<E>();
}
}