Scala中的选项和null

Scala中的选项和null,scala,Scala,如果我有以下功能: def getOrNull[T >: Null](f: => T): T = { try { f } catch { case _: NullPointerException => null } } 我想将其与如下选项一起使用: 我得到: Error:(25, 19) Option.type does not take parameters 发生了什么,我如何克服这一点?您可能想知道您指的是什么选项 从sbt控制台,使用//打印: 为了更好地了解

如果我有以下功能:

def getOrNull[T >: Null](f: => T): T = {
    try { f } catch { case _: NullPointerException => null }
}
我想将其与如下选项一起使用:

我得到:

Error:(25, 19) Option.type does not take parameters
发生了什么,我如何克服这一点?

您可能想知道您指的是什么选项

从sbt控制台,使用//打印:

为了更好地了解情况:

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,则当前目录中的类文件位于其类路径上。如果您以前在默认或空包中编译过一个选项,它将隐藏scala.Option。

如注释中所述,此代码编译正常,但您确实不应该在scala中使用null,除非您正在与Java交互

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

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

Try在Scala中被广泛使用,因此任何熟悉该语言的人都可以清楚地看到这段代码,因此不需要单独的函数。

1在2.12.5中,这段代码编译并成功运行。2您知道util.Try.toooption吗?3 ArrayIndexOutOfBoundsException不是NullPointerException的子类型,因此整个构造对于没有/-separator的字符串没有多大帮助。正如Andrey所指出的,您正在寻找Try.toOptionpeople!对我的评论投了8票,我该怎么办?如果您同意,那么投票以不可复制的方式关闭。@Andreytukin有人可能会问是什么构建工具产生了错误,但有人可能会认为错误不是虚构的。它很容易复制。如果需要,由OP使用更多信息进行更新,但我敢打赌,许多人编写了一个示例Option类或使用带有自己的Option类的命令行解析器,并且看到了这样的错误。@som snytt如果OP重新定义了Option对象或从cli解析器导入了选项,然后,它会使问题的前七行变得不相关,剩下的行读起来像我的选项一样。type不接受参数,到底发生了什么?对于这一点,没有很好的答案,除非您将其定义为不接受任何参数。当然,人们总是可以重新定义所有名称。甚至可以强制编译器不导入scala和Predef,然后定义任意疯狂的东西。但是它对世界其他地方有什么用处呢?这不是弗兰克问的问题的答案。@Tim正如我在评论中所说的,它在2.12.5中编译和运行没有问题。因此,我不清楚弗兰克问了什么。投票关闭为不可复制。@Tim这是如何克服这一问题的答案?。不幸的名称冲突并不罕见。
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$])
  }
}
val r = Try{ someString.split("/")(0) }.toOption