【问题标题】:BoxedUnit vs. Unit in ScalaScala 中的 BoxedUnit 与 Unit
【发布时间】:2015-11-24 04:55:14
【问题描述】:

BoxedUnit 和 Scala 中的 Unit 有什么区别?它们何时用作函数的返回类型?他们和REF有什么关系?这是我在处理 Unit 时遇到的类型不匹配的错误。

错误:java.lang.AssertionError:断言失败:无法在源单元 hello.scala 中从 UNIT 转换为 REF(类 BoxedUnit)-/Users/shiyu/Scala/FinalDataFlow/src/print/hello.scala ,line-347,offset=13999

【问题讨论】:

    标签: scala


    【解决方案1】:

    Unit是唯一值()的类型,读作“单位”。

    BoxedUnit 是 JVM 上 Scala 的一个实现细节,用于在进入通用上下文时对 () 进行编码,或者以其他方式分配给 Any。通常,您首先不应该听说BoxedUnit,尽管它确实泄漏到了一些用户级功能。例如((): Any).getClass().getName() == "scala.runtime.BoxedUnit"

    也就是说,您得到的错误显然是编译器崩溃,AssertionError 证明了这一点。这不是您的代码中的问题。如果它还没有在错误数据库中,你可能应该report this as a bug

    【讨论】:

    • @srjd 如果我尝试对可能包含 Unit 的 AnyVal 进行模式匹配怎么办?例如,我尝试使用case Right(Unit),但它不匹配。我应该如何进行这种模式匹配?
    • 我正在使用case Right(anyVal) if ( anyVal == Unit || anyVal.isInstanceOf[BoxedUnit]),它可以工作,但从客户的角度来看,我觉得它有点难看
    • case Right(())type Unit 的唯一值是() Unit实际上是Unit类的伴生对象,与()不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多