传入`null`到Option [Int]参数

时间:2014-06-17 01:58:02

标签: scala

我有一个函数foo

scala> def foo(maybeInt: Option[Int]) = maybeInt.map(_ + 5)
foo: (maybeInt: Option[Int])Option[Int]

scala> foo(Some(5))
res10: Option[Int] = Some(10)

但是,我可以传递null来获取NPE

scala> foo(null)
java.lang.NullPointerException
      ...

在编译时,有什么办法可以避免这个错误吗?或者在Scala中只需要null检查吗?

我强烈期望上面的代码无法通过代码审查,但我希望编译器能够抓住它。

2 个答案:

答案 0 :(得分:3)

默认情况下,对于Java interop,任何引用类型都可以是null。在类型系统中,Null是从AnyRef派生的任何内容的子类型。

结论:只是不要使用null值。在Scala中没有什么理由这样做。

答案 1 :(得分:3)

我认为你可以通过使用重载来避免它。如果您使用foo添加Null方法,则应优先考虑。但它仍然会编译,因此您必须添加其他内容。我试着不存在隐含的。像这样:

def foo(m: Option[Int]): Option[Int] = ???
def foo(m : Null)(implicit n: NonExistent): Unit = ???
sealed abstract class NonExistent

但请注意,这不会保护您免受包含null变量的影响。除了使用@NonNull之外,没有办法静态地阻止它,因为它不能很好地工作并且已被弃用。

真正的答案是,除非您正在调用Java,否则任何使用单词null都是错误的。让它抛出异常。