如果你有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'唯一常见的超类型。 –
我有一个从第三方库调用的演员,没有记录它发送的所有类型....但感谢您的快速答案! –