如何在scala模式匹配的情况下确定catch的类型?

Dav*_*ber 0 scala case pattern-matching catch-all

如果Scala中有模式匹配(case),例如:

foo match {
  case a: String => doSomething(a)
  case f: Float =>  doSomethingElse(f)
  case _ => ? // How does one determine what this was?
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确定实际捕获的类型?

Ron*_*ren 5

case x => println(x.getClass)
Run Code Online (Sandbox Code Playgroud)

太容易了 :-)

基本上,您只需要将catch-all语句中的值绑定到名称(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
Run Code Online (Sandbox Code Playgroud)