Я очень озадачен разделением между operator fun iterator()
и Iterable
интерфейсом. Единственная функция, которую требует Iterable
- это operator fun iterator()
, которая уже встроена в язык. Я не могу понять, почему в любом случае вы бы реализовали operator fun iterator()
, но не интерфейс Iterable
. Возникает вопрос: почему вы можете сделать что-то итерируемое без реализации соответствующего интерфейса? Кажется, это было бы ошибкой. Аналогично, operator fun next()
и operator fun hasNext()
не должны всегда соответствовать типу Iterator
?
Я пытался проверить, реализует ли operator fun iterator()
для типа, чтобы увидеть, если он автоматически реализует Iterable
за кулисами, но это не так. Единственная причина, по которой я могу придумать, - это какая-то совместимость с итераторами Java.
class Foo(val n: Int) {
operator fun iterator() = FooIterator(this)
// Shouldn't the language figure out that Foo is iterable?
}
class FooIterator(val foo: Foo): Iterator<Int> {
var seen = false
// Implementation goes here
}
fun <T> printAll(iter: Iterable<T>) {
for (x in iter) {
println("$x")
}
}
fun main() {
printAll(Foo(2)) // Type mismatch: Foo is not Iterable
}
Было бы разумно, чтобы любой класс, который реализует iterator()
, next()
и hasNext()
, invoke
и т. Д., Всегда реализовывал соответствующий интерфейс. Почему язык был разработан таким образом, где это не всегда так?