为什么案例类的“unapply”方法的实现中有一个“null”检查?

2024-01-22

我正在努力更换unapply案例类的伴随对象上的方法与我自己的实现。在调查了许多与实施相关的不同切线之后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传递的方法可以为 null 也可以为 invalid? IOW,用这个替换上面的实现有什么害处?

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么案例类的“unapply”方法的实现中有一个“null”检查? 的相关文章

随机推荐

  • r 在 for 循环中创建并寻址变量

    我在一个文件夹中有多个 csv 文件 我想将此文件夹中的每个 csv 文件加载到一个单独的数据框中 接下来 我想从该数据框中提取某些元素到一个矩阵中 并计算所有这些矩阵的平均值 setwd D data group 1 lt list fi
  • CMDeviceMotion 用户加速度漂移

    我正在使用以下方法获取加速度数据 CMDeviceMotion userAcceleration 我注意到一件有趣的事情 Z 轴上总是有一个小偏差 约为 0 0155 方差为 0 002 而在其他轴上 平均值接近 0 我正在使用 iPod
  • 查看 IsEnabled 属性在 Xamarin Forms 上不起作用

    这是我的列表视图 Listview 内部按钮 IsEnabled 属性不起作用 IsEnabled False 不起作用 我遵循了此步骤 但仍然不起作用https forums xamarin com discussion 47857 se
  • 寻找一个Linux PDF库来从PDF中提取注释和图像[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个免费的库 Java Ruby 它可以在linux上运行 并且可以从PDF中提取图像和注释
  • 从文件流上传到 ADLS

    我正在 ADF 中进行自定义活动 其中涉及从 Azure 存储 Blob 读取多个文件 对它们进行一些处理 最后将生成的文件写入 Azure Data Lake Store 最后一步是我停止的地方 因为据我所知 NET SDK 只允许从本地
  • .NET 应用程序中的最大线程数?

    在 C 应用程序中可以创建的最大线程数是多少 当达到这个限制时会发生什么 是否抛出某种异常 没有固有的限制 最大线程数由可用物理资源量确定 看到这个文章作者 雷蒙德 陈 https devblogs microsoft com oldnew
  • 使用 JavaMail 创建带有附件的 EML 文件 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我将使用
  • 如何在发布模式下启用框架的可测试性?

    我有一个 iOS 应用程序项目 由 Swift 3 0 编写 该工作区包含我们团队构建的动态框架 用于在整个项目中共享可重用的代码和资源 We use Activate Compilation Conditions用于切换生产服务器 url
  • PhpMyAdmin |致命错误:第 0 行未知中允许的内存大小 134217728 字节已耗尽(尝试分配 xxxxxx 字节)

    我试图找到此错误的原因 但失败了 我已经在我的服务器上安装了 PhpMyAdmin 现在在每个页面的页脚上都收到此错误 致命错误 第 0 行未知中允许的内存大小 134217728 字节已耗尽 尝试分配 10934248 字节 正如您所看到
  • “命令”对象没有属性“has_permissions”

    client command commands has permissions administrator True async def kick ctx member discord Member reason None try awai
  • IdentityServer、声明和角色

    我正在使用 Identity Server v4 但我认为与 v3 相同 和 NET Core 现在我有一个我不明白的奇怪问题 在我的 MVC 应用程序中 我使用 授权 角色 极客 保护我的控制器 操作 从以下位置查看当前用户HttpCon
  • 在android中为按钮添加阴影

    我试图在单击时在图像按钮上添加某种阴影 是否可能以及如何实现 所以我有按钮 我希望当我点击它时它看起来像是被按下的 所以我创建了新的 xml 如下所示
  • 如何在 Next JS 博客中实现上一篇文章和下一篇文章?

    我想从特定的博客文章转到上一篇文章和下一篇文章 考虑一下这个盖茨比的例子 https gatsby starter blog demo netlify com my second post https gatsby starter blog
  • 如何停止 Android webView swipeToRefresh 加载进度条?

    注意 这个问题已经被问过here https stackoverflow com questions 41467855 how to stop swipetorefresh progressbar in webview没有得到任何答案 所以
  • 在迭代 Java ArrayList 时修改它

    我想做类似的事情this https stackoverflow com questions 993025 java adding elements to a collection during iteration 但是 我不希望迭代添加的
  • ListJoinedTeams 可以指定 /me 工作,但不能指定 /user

    I tried ListJoinedTeams与指定用户 但它不起作用 我试过ListJoinedTeams与我自己和Listmessage与指定用户一起使用并且它有效 不起作用 https graph microsoft com v1 0
  • 如何在媒体查询中使用 > 或 <(大于和小于)符号

    我们可以在媒体查询中使用 gt 或 media screen and min width lt 768px 媒体查询不使用这些符号 相反 他们使用min and max 前缀 这包含在spec http www w3 org TR css3
  • bootstrap 无法连接到 Angular 6?

    npm install bootstrap 配置angular json styles node modules bootstrap dist css bootstrap min css styles scss 直接导入src style
  • OL3:按坐标从图层获取特征

    我想通过坐标获取图层的特征 此外 我想在弹出窗口中打开此功能 到目前为止我已经通过 onclick 事件解决了这个问题 但我想通过给出特征的坐标并打开特征的弹出窗口来实现 我有一个带有地图的图层和一个带有以下功能的图层 if trackMa
  • 为什么案例类的“unapply”方法的实现中有一个“null”检查?

    我正在努力更换unapply案例类的伴随对象上的方法与我自己的实现 在调查了许多与实施相关的不同切线之后unapply 看来有一个null其中大多数都受到保护 无论是在编译器生成的代码中还是在显式重新定义的实现中 编译器生成的代码为unap