问题 BoxedUnit与Scala中的单位


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

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


10637
2017-08-29 18:38


起源



答案:


Unit 是唯一值的类型 (),发音为“unit”。

BoxedUnit 是一个 实施细节 JVM上的Scala,用于编码 () 当它进入一般上下文,或以其他方式分配给 Any。通常,你不应该听到 BoxedUnit 首先,虽然它确实泄露了一些用户级功能。例如 ((): Any).getClass().getName() == "scala.runtime.BoxedUnit"

也就是说,你得到的错误显然是编译器崩溃,正如所证明的那样 AssertionError。这不是代码中的问题。你可能应该 将此报告为错误 如果它还没有在bug数据库中。


12
2017-08-30 09:45



@srjd如果我尝试在可能包含Unit的AnyVal上进行模式匹配怎么办?例如,我试图使用 case Right(Unit) 它不匹配。我该如何进行这种模式匹配? - Sebastien Lorber
我在用着 case Right(anyVal) if ( anyVal == Unit || anyVal.isInstanceOf[BoxedUnit]) 它的确有效,但从客户的角度来看,我觉得它有点难看 - Sebastien Lorber
case Right(())。独特的价值 类型  Unit 是 ()。该 值  Unit 实际上是它的伴侣 Unit 类,这是不一样的 ()。 - sjrd


答案:


Unit 是唯一值的类型 (),发音为“unit”。

BoxedUnit 是一个 实施细节 JVM上的Scala,用于编码 () 当它进入一般上下文,或以其他方式分配给 Any。通常,你不应该听到 BoxedUnit 首先,虽然它确实泄露了一些用户级功能。例如 ((): Any).getClass().getName() == "scala.runtime.BoxedUnit"

也就是说,你得到的错误显然是编译器崩溃,正如所证明的那样 AssertionError。这不是代码中的问题。你可能应该 将此报告为错误 如果它还没有在bug数据库中。


12
2017-08-30 09:45



@srjd如果我尝试在可能包含Unit的AnyVal上进行模式匹配怎么办?例如,我试图使用 case Right(Unit) 它不匹配。我该如何进行这种模式匹配? - Sebastien Lorber
我在用着 case Right(anyVal) if ( anyVal == Unit || anyVal.isInstanceOf[BoxedUnit]) 它的确有效,但从客户的角度来看,我觉得它有点难看 - Sebastien Lorber
case Right(())。独特的价值 类型  Unit 是 ()。该 值  Unit 实际上是它的伴侣 Unit 类,这是不一样的 ()。 - sjrd