2

我正在努力unapply用我自己的实现替换案例类的伴随对象上的方法。在调查了许多与 implementation 相关的不同切线之后unapply,似乎null在它们中的大多数中都有一个保护,无论是在编译器生成的代码中,还是在它被显式重新定义的实现中。编译器生成的代码unapply看起来与此类似(其中一些使用eq而不是ne):

def unapply(location: Location): Option[(Double, Double)] =
  if (location ne null)
    Some((location.longitude, location.latitude))
  else
    None

鉴于null在纯(即惯用的)Scala 代码中绝对不应该使用,为什么null要执行此检查?它是否与 Java 互操作(因为 Java 仍然沉迷于利用null)泄漏到unapply方法中有关?如果我删除了检查,因为我已经消除了unapply传递方法的案例类实例可能为空或无效的可能性,我会遭受什么(如果有的话)不良后果?IOW,用这个替换上述实现有什么害处?

def unapply(location: Location): Option[(Double, Double)] =
  Some((location.longitude, location.latitude))
4

1 回答 1

1

否则,这将产生非常令人惊讶的行为:

nullableJavaMethod() match {
  case Location(lat, long) => "Handle location here!"
  case null => "Handle null here!"
}

您可能更喜欢另一种处理 null 的方法,但这并不意味着如果有人更喜欢这种方法,您应该使用 NPE 进行上述崩溃。请注意,这是特定于 的unapply,因为其他方法不会遇到上述问题。

于 2019-05-28T05:55:27.260 回答