如果你有Scala中的一個模式匹配(情況),例如:如何確定scala模式匹配情況下的catch的類型?
foo match {
case a: String => doSomething(a)
case f: Float => doSomethingElse(f)
case _ => ? // How does one determine what this was?
}
有沒有辦法來確定哪些類型實際上是陷入了包羅萬象的?
如果你有Scala中的一個模式匹配(情況),例如:如何確定scala模式匹配情況下的catch的類型?
foo match {
case a: String => doSomething(a)
case f: Float => doSomethingElse(f)
case _ => ? // How does one determine what this was?
}
有沒有辦法來確定哪些類型實際上是陷入了包羅萬象的?
foo match {
case a: String => doSomething(a)
case f: Float => doSomethingElse(f)
case x => println(x.getClass)
}
case x => println(x.getClass)
太容易了:-)
基本上,你只需要值在包羅萬象的聲明綁定到一個名稱(x
在這種情況下),那麼你可以使用標準getClass方法來確定類型。
如果您試圖根據類型執行特定的邏輯,那麼您可能會做錯了。如果你需要一些你不想在那裏定義內聯的'默認'情況,你可以把你的匹配語句作爲部分函數。例如:
scala> val defaultHandler: PartialFunction[Any, Unit] = {
| case x: String => println("String: " + x)
| }
defaultHandler: PartialFunction[Any,Unit] = <function1>
scala> val customHandler: PartialFunction[Any, Unit] = {
| case x: Int => println("Int: " + x)
| }
customHandler: PartialFunction[Any,Unit] = <function1>
scala> (customHandler orElse defaultHandler)("hey there")
String: hey there
類不是真正的類型。可能有許多類型映射到一個類。 –
理想情況下,您不會販賣'Any',這是'String'和'Float'唯一常見的超類型。 –
我有一個從第三方庫調用的演員,沒有記錄它發送的所有類型....但感謝您的快速答案! –