Null类型的隐式转换

ree*_*olt 1 scala implicit-conversion

我正在尝试在Scala中重现C#语法:

C#代码:

val myValue = myObject ?? new MyClass();
Run Code Online (Sandbox Code Playgroud)

基本上'myValue'将包含'myObject'(如果它不为null),或者一个新的'MyClass'实例(如果它为null).

这是我试图运行的Scala代码:

case class ShortCond(original: Any){
  def ??(fallback : Any) {
    if (original == null)
      return fallback
    return original
  }
}
implicit def any2ShortCond(original: Any) = ShortCond(original)


val myString = null
val value = myString ?? "myString is null"
Run Code Online (Sandbox Code Playgroud)

它在myString不为null时有效,但在myString为null时失败,它返回:

error: value ?? is not a member of Null
val value = myString ?? "myString is null"
Run Code Online (Sandbox Code Playgroud)

我理解错误,但有没有办法在Scala中实现这一点,或者它是不可能的?

谢谢

jwv*_*wvh 5

第一个建议:在编写Scala代码时,您应该尝试坚持使用Scala习语.Scala的方法可能就像......

implicit class ShortCond(original: Any){
  def ??(fallback : Any) =
    Option(original).getOrElse(fallback)
}

val str:String = null
str ?? 34  // res0: Any = 34
"x" ?? 43  // res1: Any = x
Run Code Online (Sandbox Code Playgroud)

但这有一个坏主意,原因有很多,主要是你试图返回混合类型,这意味着编译器将其解析为type Any,这不是好Scala.一旦编译器不知道您的类型val是什么,那么您将从类型系统的完全支持中移除自己.