【问题标题】:Pattern matching code for matching type of Some[x] is not reachable in scalaSome[x] 的匹配类型的模式匹配代码在 scala 中无法访问
【发布时间】:2018-04-06 00:06:57
【问题描述】:
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] => "它的字符串" 有人能解释一下这个警告吗

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

【问题讨论】:

    标签: scala pattern-matching


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        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],那么如果它实际上是其他东西,您可能会收到运行时错误。这些错误很难跟踪,因此注意任何类型的擦除警告很重要。

        【讨论】:

          猜你喜欢
          • 2020-08-09
          • 2016-12-01
          • 1970-01-01
          • 2014-03-05
          • 2018-01-03
          • 1970-01-01
          • 1970-01-01
          • 2013-03-17
          相关资源
          最近更新 更多