2017-06-28 3 views
2

Étant donné le scénario suivantScala: Recueillir avec les génériques

val items = List("a", "b", "c", 1, 2, 3, false, true) 
def intItems = items.collect {case i : Int => i} 
def stringItems = items.collect {case s : String => s} 

est-il un moyen de créer une fonction générique pour gérer ce comportement?

J'ai essayé les suivantes

def itemsAs[T]: List[T] = items.collect { case item: T => item } 

mais

itemsAs[Int] 

retours

List[Int]] = List(a, b, c, 1, 2, 3, false, true) 

Une autre approche est de fournir le partial function comme argument, mais encore de dupliquer le case i: Int => i et case s: String => s . Y a-t-il un moyen de le rendre plus compact? Merci

Répondre

4
val items = List("a", "b", "c", 1, 2, 3, false, true) 
import scala.reflect.ClassTag 
def collect[T: ClassTag] = items.collect { case x: T => x } 
collect[Int] // List(1, 2, 3) 
collect[String] // List(a, b, c) 

Voir http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html pour plus de détails.

+0

Ceci est l'approche que j'ai suivie, mais j'ai ajouté les éléments 'def suivants [T <: MyInterface] (balise implicite: ClassTag [T]):' afin de le faire dactylographier et de ne pas autoriser chaque paramètre – Bruno