首页 > 解决方案 > 无法解释的 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 转换为案例类是主要嫌疑人,但如果值的类型不正确,我预计实例化案例类会出现运行时错误。

谁能解释这里发生了什么?

标签: jsonscalagenericsclasscastexceptiontype-erasure

解决方案


显然,将 JSON 转换为案例类是主要嫌疑人,但如果值的类型不正确,我预计实例化案例类时会出现运行时错误。

我想了解为什么 Scala 在创建案例类时不会抱怨,只有当我尝试操纵Option[Long]它看起来根本不包含 Long 的情况时...

我想事情是在类型擦除中。为了

case class SomeCaseClass(longOpt: Option[Long])

Option[Long]只是Option[_]在运行时。所以ClassCastException在实例化案例类期间没有,因为它不是强制转换Option[Integer]Option[Long],而是转换Option[_]Option[_]

当您使用Option它的内容时,ClassCastException因为您尝试转换IntegerLong.


推荐阅读