2014-12-10 10 views
5

Betrachten wir ein Array[Any]Scala Gegenstände zu sammeln eines Typs aus einer Sammlung

val a = Array(1,2,"a") 
a: Array[Any] = Array(1, 2, a) 

Wir alle Elemente des Typs sammeln können Int wie diese,

a.collect { case v: Int => v } 
res: Array[Int] = Array(1, 2) 

Obwohl, wie eine Funktion zu definieren, die Elemente sammelt von einem gegebenen Typ, dies erfolglos versucht zu haben,

, die

co[Int](a) 
ArraySeq(1, 2, a) 

co[String](a) 
ArraySeq(1, 2, a) 
+2

Putting Elemente verschiedenen Typen wie ganze Zahlen und Strings in einer Sammlung ist nicht idiomatischen in Sprachen statisch typisierten wie Scala. – Jesper

+0

@Jesper stimme völlig zu, mit scala.language.dynamics – elm

Antwort

7

Sie ein ClassTag für die Mustererkennung benötigen, um liefert, um tatsächlich funktionieren:

import scala.reflect.ClassTag 

def co[T: ClassTag](a: Array[Any]) = a.collect { case v: T => v } 
+0

Brilliant, Danke! – elm

Verwandte Themen