有没有办法让这个隐式方法在匹配前调用x来满足匹配的类型要求?
如果我直接调用它会按预期工作,但我想知道是否可以推断出该调用。
object ImplicitTest extends App {
implicit def denull[T<:Any](mightBeNull:T):Option[T] = {
if (mightBeNull == null) None
else Some(canBeNull)
}
var x:String = null
x match { //works if i do "denull(x) match {"
case Some(str:String) =>
println(str)
case None => None
}
}
答案 0 :(得分:6)
您应使用denull
代替Option.apply
方法。它做同样的事情。应始终明确处理可能的空值!隐式转换很危险,对于必须使用代码的其他人来说可能会造成混淆。这样做:
Option(x) match {}
或者在大多数情况下甚至更好:
Option(x).fold { ... } { ... }
答案 1 :(得分:1)
如果需要,可以使用隐式转换的方法来包装它:
def print[A](opt: Option[A]) = opt.foreach(println)
当您对具有空值的变量调用此方法时,Scala编译器会解析您的隐式转换方法denull
,如果它不是None
,则会打印它。
但您可以在没有denull
方法的情况下执行此操作:
var str: String = null
Option(str).foreach(println)
Scala不会解决模式匹配中的隐式转换,因为不知道它需要转换为其他类型。这种转换方式是一种针对类型错误的机制,当编译器可以执行“最后一次尝试”并使用类型A
的某些值时,需要类型B
。在模式匹配中,您只需匹配类型或其他内容