[英]How to solve Pattern matching and type erasure in Scala
我正在處理現有的代碼:
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]] }
我知道它仍然不是類型安全的,但是我們得到了警告,並且該風險現在已明確顯示在代碼中。 但這更冗長...
那么,您如何看待這種解決方法? 還有更好的方法嗎?
略顯冗長的語法可以抑制警告:
def matchAny(a: Any) = a match { case s: Option[String@unchecked] => f(s) }
在這種情況下( Option[String]
匹配),您還可以擁有更安全的版本,如果Option
String
不是String
則該版本將立即失敗:
def matchAny(a: Any) = a match { case s@(None | Some(_: String)) => f(s) }
我建議改用Shapeless:
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) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.