Scala中的Option和null

时间:2018-05-25 00:58:46

标签: scala

如果我有以下功能:

def getOrNull[T >: Null](f: => T): T = {
    try { f } catch { case _: NullPointerException => null }
}

我希望像Option一样使用它:

val r = Option(getOrNull(someString.split("/")(0)))

我明白了:

Error:(25, 19) Option.type does not take parameters

发生了什么,我该如何克服这个?

2 个答案:

答案 0 :(得分:0)

您可能想知道您所指的是Option

sbt console开始,使用//print<tab>

scala> Option //print
   scala.Option // : Option.type

为了更好的背景:

package nooption

class Option(arg: String)  // some other option on class path
object Option

object Test {
  import scala.reflect.internal.util.ScalaClassLoader

  def main(args: Array[String]): Unit = println {
    //Option(null)
    //ScalaClassLoader.originOfClass(classOf[Option])
    ScalaClassLoader.originOfClass(classOf[Option$])
  }
}

伴侣对象的类名最后有一个美元。

您的IDE可能会“定义。”

如果在命令行启动了REPL,则当前目录中的类文件位于其类路径中。如果您之前在默认或“空”包中编译了Option,则会隐藏scala.Option

答案 1 :(得分:0)

如评论中所述,此代码确实编译正常,但除非您与Java连接,否则您不应在Scala中使用null

这是实现代码的更好方法:

val r = Try{ someString.split("/")(0) }.toOption

Try在Scala中广泛使用,因此对于使用该语言的任何人来说,此代码都很清楚,因此不需要单独的函数。