Быстрое исправление состоит в том, чтобы избежать структурного возвращаемого типа:
object DemoFail extends App {
// The same with an explicit (non structural) return type
// vvvvvvvvvvvvv
def it[T <: AnyRef](x: T): Iterator[T] =
new Iterator[T] {
var i = x // no more error
def next = i
def hasNext = true
}
for (i ← it(int2Integer(4))) println(i)
}
Действительно, метод it
для объекта DemoFail
не имеет явного возвращаемого типа.Следовательно, этот тип возврата выводится компилятором.
Здесь, когда вы переопределяете существующие элементы и добавляете новый в Iterator[T]
, выведенный тип возврата метода it
является структурным типомform Iterator[T] with Object {def next: T; var i : T; def hasNext: Boolean}
(как может предложить IDE, например IntelliJ).
Таким образом, вы определяете метод, тип возвращаемого значения которого является структурным типом, который использует абстрактный тип этого же метода.Это то, что беспокоит скаляк (структурный тип с абстрактным типом того же метода).