如果我有以下功能:
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
发生了什么,我该如何克服这个?
答案 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中广泛使用,因此对于使用该语言的任何人来说,此代码都很清楚,因此不需要单独的函数。