2015-06-03 87 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) }