Scala: собирать с помощью дженериков

Учитывая следующий сценарий

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}

Есть ли способ создать универсальную функцию для обработки этого поведения?

Я попробовал следующее

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

но

itemsAs[Int] 

возвращается

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

Другой подход заключается в предоставлении partial function в качестве аргумента, но все равно придется дублировать case i: Int => i а также case s: String => s, Есть ли способ сделать его более компактным? Спасибо

1 ответ

Решение
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)

См. http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html для получения более подробной информации.

Другие вопросы по тегам