2014-12-10 5 views
5

considerare un Array[Any]Scala raccogliere gli oggetti di un tipo da una raccolta

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

Possiamo raccogliere tutti gli elementi di tipo Int come questo,

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

Anche se come definire una funzione che raccoglie articoli di un determinato tipo, avendo provato senza successo questo,

def co[T](a: Array[Any]) = a.collect { case v: T => v } 
warning: abstract type pattern T is unchecked since it is eliminated by erasure 

che offre

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

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

Putting elementi di tipo diverso, come numeri interi e stringhe in una collezione non è idiomatica in lingue staticamente tipizzati come Scala. – Jesper

+0

@Jesper sono completamente d'accordo, utilizzando scala.language.dynamics – elm

risposta

7

è necessario fornire un ClassTag per la partita modello realmente funzionare:

import scala.reflect.ClassTag 

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

Brillante, grazie! – elm