2016-04-21 11 views
1

Ich brauche eine Funktion, die in ein Array, eine Karte, eine Liste [ziemlich viele Container mit einer toIterator Methode], iterieren und drucken Sie ihre Elemente.Scala generische, die Methode toIterator implementiert

Ich versuchte dies:

def method[CollectionT <: TraversableLike[Any, Any]](collection: CollectionT, numElements: Int) { 
    val iterator = collection.toIterator 
    for(i <- 0 until numElements) { 
    if(iterator.hasNext) { 
     println(iterator.next()) 
    } 
    } 
} 

^Aber es für Array funktioniert nicht [T]

Wie kann ich eine genetische Funktion in Scala zu machen, die in jeder Instanz einer Klasse nehmen, die hat eine "toIterator: Iterator[A]" Methode?

Antwort

5

Eine allgemeine Art, die Sie hier verwenden können, ist GenTraversable:

scala> def printAll(coll: collection.GenTraversable[_]) = coll.foreach(println) 
defined function printAll 
scala> printAll("aaa") 
a 
a 
a 

scala> printAll(Array(1,2,3)) 
1 
2 
3 

scala> printAll(Seq(4,5,6)) 
4 
5 
6 

Sie auch einen Iterator nicht brauchen. Sie können einfacher foreach aufrufen oder ein for Verständnis verwenden.

+0

Ich würde vorschlagen, 'GenTraversableOnce' (oder' TraversableOnce' zu ​​verwenden, wenn Sie parallele Sammlungen nicht zulassen möchten). –

+0

@PaulDraper - GenTraversableOnce ist eine Superklasse von GenTraversable. Meinten Sie "Ich würde vorschlagen, GenTraversableOnce zu verwenden, wenn Sie parallele Sammlungen zulassen möchten?" –

+0

@MichaelLafayette Ich denke Paul meinte "GenTraversableOnce" anstelle von "GenTraversable". –