Unit.type 和 Unit 之间有什么区别?

4
我有以下方法:

override def insertAll(notifications: Seq[PushNotificationEncoded])
                      (implicit ec: ExecutionContext): Future[Unit] = {
  val f = Future.sequence(notifications.map(insert)).map(_ => Unit)
  f.onFailure { case ex => sys.error(s"Got exception whilst saving PushNotification: $ex") }
  f
}

它会产生以下编译器错误:
  type mismatch;
  found   : scala.concurrent.Future[Unit.type]
  required: scala.concurrent.Future[Unit]
     f
     ^

我认为Unit是一个只有一个元素的类型,因此在处理Unit时不应该有任何混淆。我尝试通过谷歌搜索来了解更多关于"Unit.type"的信息,但是没有找到太多有用的内容。

如果我像这样简化方法,那么它可以正常工作:

override def insertAll(notifications: Seq[PushNotificationEncoded])
                      (implicit ec: ExecutionContext): Future[Unit] =
  Future.sequence(notifications.map(insert)).map(_ => Unit)

这里发生了什么事情?
3个回答

7

()Unit 的唯一实例。作为值使用的 Unit 是其伴生对象(主要管理装箱和拆箱)。

val f = Future.sequence(notifications.map(insert)).map(_ => ())

2

x.type单例类型,它是 x 的类型:其唯一的两个值是 xnullx 必须是一个值的 "稳定标识符",例如 Unit 的伴生对象。


-1
在Scala中,类型也是对象,并且像任何对象一样有自己的类型。 ()是类型Unit的一个实例。 UnitUnit.type的一个实例。(我认为甚至没有更高的方式-没有Unit.type.type之类的东西)。
对于大多数非奇特目的,您不需要担心它,只要在需要引用Unit类型的实例时使用()即可,您真的不需要在其他地方使用另一个。

2
不幸的是,第一段内容基本上是错误的:1.类型不是对象(它们在Scala反射中有代表它们的对象,但这与此处无关);2.并非所有对象都有自己的类型;3.作为Unit.type实例的Unit不是类型Unit,而是它的伴生对象,正如Ramsey的回答所说(它们之间的关系在Scala中相当弱)。 - Alexey Romanov
感谢您澄清。 - CalumMcCall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接