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