I this function haben eine Array
zu einem ParArray
, was die Anzahl der Threads als Parameter zu konvertieren:generische Typparameter für die Umwandlung in parallele Sammlung
def parN[T](collection: Array[T], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Nun möchte Ich mag diese generisch machen, so dass es arbeitet mit Sammlungen anderer als Array
:
def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Aber when I call it mit parN(Array(1, 2, 3), 2)
, bekomme ich diesen Fehler:
inferred type arguments [Int,Array] do not
conform to method parN's type parameter bounds
[S,T[S] <: scala.collection.Parallelizable[S,scala.collection.parallel.ParIterable[S]]]
Auf der anderen Seite, das funktioniert:
val x: Parallelizable[Int, ParIterable[Int]] = Array(1, 2, 3)
Irgendwelche Ideen, was mit meiner Art Parameter falsch sein könnte?
Wow, schlag mich dazu. Das Typklassenmuster ist der Weg dorthin. Müssen Sie jedoch nicht eine 'Manifest'-Anforderung hinzufügen, um mit Arrays zu arbeiten? – wheaties
@wheaties no a 'Manifest \ ClassTag' wird nicht einmal benötigt, da seine Methode kein Array erzeugt (' Parallelizable.par' benötigt kein Manifest, es kann immer eine Par-Collection erstellen). Und im Fall von Arrays wird nur das ursprüngliche Array umbrochen, es wird nicht einmal kopiert. – gourlaysama
Danke für die detaillierte Antwort, ich benutze eine '<%' Ansicht gebunden in 'CustomParallelizable'. – ValarDohaeris