2013-04-16 38 views
0

如果你有Scala中的一个模式匹配(情况),例如:如何确定scala模式匹配情况下的catch的类型?

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

有没有办法来确定哪些类型实际上是陷入了包罗万象的?

+0

理想情况下,您不会贩卖'Any',这是'String'和'Float'唯一常见的超类型。 –

+0

我有一个从第三方库调用的演员,没有记录它发送的所有类型....但感谢您的快速答案! –

回答

2
foo match { 
    case a: String => doSomething(a) 
    case f: Float => doSomethingElse(f) 
    case x => println(x.getClass) 
} 
5
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 
+1

类不是真正的类型。可能有许多类型映射到一个类。 –