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
的代码,则可以将返回值包装在选项中<代码>选项(空)=无