2015-06-03 63 views
1

我工作的代码现有片:如何解决模式匹配和类型擦除斯卡拉

def f(s: Option[String]) = … 
def matchAny(a: Any) = a match { case s: Option[String] => f(s) } 

,编译器警告我(这是正常的,因为它不是类型安全)。

def matchAny(a: Any) = a match { case s: Option[_] => f(s.asInstanceOf[Option[String]] } 

我知道它仍然不是类型安全的,但我们获得了警告,并且现在显然在代码中出现风险。但它更详细...

那么,你觉得这个解决方法是什么?还有更好的方法吗?

回答

1

稍微更简洁的语法,禁止警告:

def matchAny(a: Any) = a match { case s: Option[[email protected]] => f(s) } 

在这种情况下(Option[String]匹配),你也可以有更安全的版本,它会立即失败,如果不是String别的东西是在Option

def matchAny(a: Any) = a match { case [email protected](None | Some(_: String)) => f(s) } 
0

我会建议使用不成形代替:

import shapeless._ 
def f(s: Option[String]) = Some("hello world") 
val optionType: TypeCase[Option[String]] = TypeCase[Option[String]] 
def matchAny(a: Any) = a match { case optionType(s) => f(s) }