簡體   English   中英

在scala中無法找到用於Some [x]的匹配類型的模式匹配代碼

[英]Pattern matching code for matching type of Some[x] is not reachable in scala

val what: Option[Any] = Some("dab")

what match{
  case a : Some[Int] => "its int"
  case b : Some[String] => "its string"
  case None => "42"
}

警告的結果是警告:(41,29)無法訪問的代碼案例b:Some [string] =>“其字符串”可以給我一些警告嗎

PS:忽略類型擦除警告。 ^

那是因為更高種類的類型在運行時中不存在。 我的意思是,在運行時,模式匹配的字節碼將無法區分Some [Int]和Some [String]。 因為全部都是Some [Any],這就是發出警告消息的原因。

查看一些談論的帖子: https : //medium.com/@sinisalouc/overcoming-type-erasure-in-scala-8f2422070d20

在Scala中,泛型在運行時被刪除,這意味着List [Int]和List [Boolean]的運行時類型實際上是相同的。 這稱為類型擦除。 有關更多信息, 請參閱

您不應忽略有關類型擦除的警告,因為這是導致問題的原因。

在這種情況下,Java運行時無法區分Some[T]不同變體,因此Some[Int]與任何Some[T]匹配,因此Some[String]永不匹配。

為了使這項工作有效,您必須提取Option的內容,然后進行匹配,如下所示:

what match {
  case Some(x) => x match {
    case _: Int => "its int"
    case _: String => "its string"
  }
  case None => "42"
}

注意

盡管您的代碼可以編譯,但不會執行您想要的操作。 特別是,它將對任何非空Option值執行第一種case 如果您的代碼假定它是Some[Int] ,則實際上可能是其他錯誤,您可能會遇到運行時錯誤。 這些錯誤可能很難跟蹤,因此務必注意任何類型擦除警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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