簡體   English   中英

如何在Scala中解決模式匹配和類型擦除

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM