Scala 将'null'传递给选项[Int]参数

Scala 将'null'传递给选项[Int]参数,scala,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 ...

我有一个函数
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
检查


我强烈期望上面的代码在代码审查中失败,但我希望编译器能够捕获它。

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


结论:不要使用
null
值。在Scala中这样做的理由很少。

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


结论:不要使用
null
值。在Scala中这样做的理由很少。

我认为可以通过使用重载来避免。如果您添加了一个采用
Null
foo
方法,则应以该方法为准。不过,它仍将编译,因此您必须添加其他内容。我会尝试一种不存在的暗示。大概是这样的:

def foo(m: Option[Int]): Option[Int] = ???
def foo(m : Null)(implicit n: NonExistent): Unit = ???
sealed abstract class NonExistent
但是,请注意,这不会保护您免受包含
null
的变量的影响。除了使用@NonNull之外,没有任何方法可以静态地防止这种情况发生,因为它工作不好,已经被弃用了


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

我认为可以通过使用重载来避免它。如果您添加了一个采用
Null
foo
方法,则应以该方法为准。不过,它仍将编译,因此您必须添加其他内容。我会尝试一种不存在的暗示。大概是这样的:

def foo(m: Option[Int]): Option[Int] = ???
def foo(m : Null)(implicit n: NonExistent): Unit = ???
sealed abstract class NonExistent
但是,请注意,这不会保护您免受包含
null
的变量的影响。除了使用@NonNull之外,没有任何方法可以静态地防止这种情况发生,因为它工作不好,已经被弃用了


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

为什么要将
null
传递给接受
选项[Int]
(或曾经)的函数?我永远不会传入
null
,但我想知道编译器是否/如何检查这种行为。您希望编译器捕获什么?检查什么行为?您无法阻止
null
被传递到任何地方。编译器不可能保护您免受可能引发的所有异常的影响。如果您没有故意传递
null
,并且您正在使用的API没有传递
null
,那么有什么需要担心的呢?就像@LimbSoup所说的,您可以这样设计代码。不要使用
null
,如果您依赖于可能返回
null
的代码,则可以将返回值包装在
选项中
Option(null)==None
为什么要将
null
传递给接受
Option[Int]
(或曾经)的函数?我永远不会传入
null
,但我想知道编译器是否/如何检查此类行为。您希望编译器捕获什么?检查什么行为?您无法阻止
null
被传递到任何地方。编译器不可能保护您免受可能引发的所有异常的影响。如果您没有故意传递
null
,并且您正在使用的API没有传递
null
,那么有什么需要担心的呢?就像@LimbSoup所说的,您可以这样设计代码。不要使用
null
,如果您依赖于可能返回
null
的代码,则可以将返回值包装在
选项中<代码>选项(空)=无