我有以下設置:如何使用模式匹配中的類型信息?
trait TypeA { override def toString() = "A" }
trait TypeB { override def toString() = "B" }
trait TypeC { override def toString() = "C" }
def foo[T](t: T) = println(t)
現在我可以做這樣的事情:
val valueB: Any = new TypeB {}
val typedValue = valueB match {
case t: TypeA => foo(t)
case t: TypeB => foo(t)
case t: TypeC => foo(t)
}
// prints "B"
如果我想概括這種模式匹配塊,我可以簡單地做:
val typedValue = valueB match {
case t => foo(t)
}
它會工作。但是,在我真正的用例中,我需要在調用方法時明確指定類型信息,因爲沒有函數參數可以從中推斷出來。所以如果foo()
是一個泛型方法,參數化爲類型參數T
,但沒有那個類型的實際參數來推斷,我可以將它推廣到只與一個case語句匹配的模式(可能使用Reflection API)?
那麼,如何推廣呢?
val typedValue = valueB match {
case t: TypeA => foo[TypeA]()
case t: TypeB => foo[TypeB]()
case t: TypeC => foo[TypeC]()
...
}
這似乎編譯:'情況下T => FOO [t.type]( )'試一試。 – jwvh
困難的部分是,如何使模式匹配真正提取實際類型?我希望能夠說'val t:Any = ...',並且在模式匹配部分我會匹配實際的類型。看到編輯的問題(val valueB現在是'Any'類型)。如果'valueB'被聲明爲「Any」類型,那麼你的建議很不幸地不起作用,並且也有一個奇怪的消息(未指定的值參數:t.type)。 – slouc