在scala中无法访问Some [x]的匹配类型的模式匹配代码

时间:2018-04-05 09:29:28

标签: scala pattern-matching

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:一些[string] => "它的字符串" 有些人可以向我说明这个警告

P.S:忽略类型擦除警告。                            ^

3 个答案:

答案 0 :(得分:1)

这是因为在运行时不存在更高级的kinded类型。我的意思是,在运行时,模式匹配字节码将无法区分Some [Int]和Some [String]。因为它将是所有Some [Any],这就是警告信息的原因。

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

答案 1 :(得分:1)

在Scala中,泛型在运行时被擦除,这意味着List [Int]和List [Boolean]的运行时类型实际上是相同的。这称为类型擦除。 有关详细信息refer

答案 2 :(得分:1)

您不应忽略有关类型擦除的警告,因为这是造成问题的原因。

在此上下文中,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"
}

注意

虽然你的代码会编译,但它不会做你想要的。特别是,它将为任何非空case值执行第一个Option。如果您的代码假定它是Some[Int],那么如果它实际上是其他东西,您可能会遇到运行时错误。这些错误很难跟踪,因此注意任何类型的擦除警告都很重要。