我有一個Scala集合,其中包含不同子類型的對象。在Scala中,如何在運行時通過指定類型進行過濾?
abstract class Base
class A extends Base
class B extends Base
val a1 = new A()
val a2 = new A()
val b = new B()
val s = List(a1, a2, b)
我想過濾掉所有A
對象或B
對象。如果我知道我想在編譯時過濾的對象,那麼我可以輕鬆地做到這一點。
s.filter(_.isInstanceOf[A]) // Give me all the As
s.filter(_.isInstanceOf[B]) // Give me all the Bs
我可以這樣做,如果我只知道在運行時過濾的對象類型嗎?我想寫一個這樣的函數。
def filterType(xs:List[Base], t) = xs.filter(_.isInstanceOf[t])
哪裏t
指示我是否要A
型或B
的對象。
當然,我不能這樣寫,因爲類型擦除。有沒有一種慣用的斯卡拉方式來解決這個使用類型標籤?我一直在閱讀Scala類型標籤文檔和相關的StackOverflow帖子,但我無法弄清楚。
對你有好處,因爲我沒有意識到'match'可以利用'ClassTag',這真的很關鍵。 – wingedsubmariner