2015-11-28 2 views
0

Я пытаюсь получить функцию, которая возьмет «тип» в качестве параметра, а затем вернет все вхождения этого типа.Фильтр для различных типов scala

val a = List(1 , 2 , true, "Hello") 

def f(a: List[Any], b: ???): List[Any] = { 
    a.filter(p => p.isInstanceOf[b]) 
} 

f(a,???) 

Так что f(a,Int) вернется List(1, 2)

ответ

3

Рассмотрим ClassTag следующим образом,

def f[T: scala.reflect.ClassTag](xs: List[Any]) = xs.collect { case v: T => v } 

Следовательно

f[Int](xs) 
res: List[Int] = List(1, 2) 

Примечание ClassTag представляет интерес в коллекции, элементы типа (типов) неизвестны во время компиляции.

2

ПРИМЕЧАНИЕ: Использование осуждается Manifest. См. Принятый ответ для продвижения вперед.

Try:

def f [T:Manifest](a: List[Any]): List[T] = a.collect {case x: T => x} 

Что вы можете использовать так:

val filteredList = f[Int](a) 

Имейте в виду, List[Any] почти всегда плохая идея. Вероятно, есть лучший способ решить проблему, в зависимости от того, что вы пытаетесь выполнить.

+2

'Manifest' устарел, вместо этого вы должны использовать теги типов. См. [TypeTags and Manifests] (http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html). Согласитесь, что обычно не рекомендуется иметь «Список [Любой]». – Jesper

+0

'ClassTag' работает, когда сопоставление образцов на' T', я не думаю, что 'TypeTag' делает. –