json - 无法解释的 scala 装箱异常
问题描述
我在 Scala 中看到一些奇怪的(取消)装箱行为,我无法解释。
考虑以下代码:
case class SomeCaseClass(longOpt: Option[Long])
def someMethod(l: Long): Unit = ???
val x: SomeCaseClass = // Case class populated from JSON in some code I do not control
x.longOpt.map(l => someMethod(l))
尝试调用会someMethod
产生以下错误:
java.lang.ClassCastException java.lang.Integer cannot be cast to java.lang.Long
at scala.runtime.BoxesRuntime.unboxToLong(BoxesRuntime: 105)
运行以下:
x.longOpt.map(_.getClass).get
长产
显然,将 JSON 转换为案例类是主要嫌疑人,但如果值的类型不正确,我预计实例化案例类会出现运行时错误。
谁能解释这里发生了什么?
解决方案
显然,将 JSON 转换为案例类是主要嫌疑人,但如果值的类型不正确,我预计实例化案例类时会出现运行时错误。
我想了解为什么 Scala 在创建案例类时不会抱怨,只有当我尝试操纵
Option[Long]
它看起来根本不包含 Long 的情况时...
我想事情是在类型擦除中。为了
case class SomeCaseClass(longOpt: Option[Long])
Option[Long]
只是Option[_]
在运行时。所以ClassCastException
在实例化案例类期间没有,因为它不是强制转换Option[Integer]
为Option[Long]
,而是转换Option[_]
为Option[_]
。
当您使用Option
它的内容时,ClassCastException
因为您尝试转换Integer
为Long
.
推荐阅读
- oracle - 在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql
- java - 在 @SpringBootTest 中使用类时,@ConfigurationProperties 不起作用
- c# - 服务器应用程序出错 ipHostInfo.AddressList[0]
- typescript - 解析 jest.mock 中的 TypeScript 路径
- javascript - 如何一次删除多张照片中的对象?
- scrollbar - 水平滚动菜单一直滚动到开始
- python - 为什么我需要更新与基地的连接?
- python-3.x - 如何在列表中附加多个字符串值(如果存在于列表中)
- javascript - 使用 String.replace() 时防止在 JavaScript 中替换 \n
- reactjs - ReactiveSearch(Web):一旦返回同一页面,分页就会重置