I think it is entirely legitimate - an Iterator
is just a stream of "stuff". Why should the stream necessarily be bounded?
Plenty of other languages (e.g. Scala) have the concept of unbounded streams built in to them and these can be iterated over. For example, using scalaz
scala> val fibs = (0, 1).iterate[Stream](t2 => t2._2 -> (t2._1 + t2._2)).map(_._1).iterator
fibs: Iterator[Int] = non-empty iterator
scala> fibs.take(10).mkString(", ") //first 10 fibonnacci numbers
res0: String = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
EDIT: In terms of the principle of least surprise, I think it depends entirely on the context. For example, what would I expect this method to return?
public Iterator<Integer> fibonacciSequence();