Здесь ключ к тому, чтобы убедиться, что вы используете итератор метода с Iterable. Scala 2.8.0 также многое сделал для обеспечения согласованности типов в вызовах коллекций.
scala> val x = new Iterable[String] {
| def iterator = List("HAI", "YOU", "GUYS").iterator
| }
x: java.lang.Object with Iterable[String] = line18(HAI, YOU, GUYS)
Я бы также рассмотрел использование Stream вместо итератора. Подход итератора создаст весь набор файлов при вызове метода итератора. Поток может быть ленивым.
scala> def files(f : File) : Stream[File] = {
| if(f.isDirectory) {
| f.listFiles.toStream.map(files).flatten
| } else Stream(f)
| }
files: (f: java.io.File)Stream[java.io.File]
scala> files(new File("/home/jsuereth/projects/scala/scala"))
res1: Stream[java.io.File] = Stream(/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class, ?)
scala> res1 take 10 foreach println
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/scala$$anon$1.class
...
В качестве альтернативы, если вы хотите включить каталоги в поток, попробуйте следующее:
scala> def files_with_dirs(f : File) : Stream[File] = {
| if(f.isDirectory) Stream.cons(f, f.listFiles.toStream.map(files).flatten)
| else Stream(f)
| }
files_with_dirs: (f: java.io.File)Stream[java.io.File]