scala.Unit 和 () 不一样吗?

Is scala.Unit not same as ()?

我从 Scala hierarchy 中看到 AnyValscala.UnitBooleanChar 和其他 Number 类型的超类型。

scala> val list1 = List((),  1 ) 
list: List[AnyVal] = List((), 1)  // I see this is valid when compared with hierarchy tree.

scala> val list2 = List(Unit,  1 )
list: List[Any] = List(object scala.Unit, 1) // Why???

我看到 list1AnyVal 类型,而 list2Any 类型,即使它们具有相同的数据(我假设)。

()Scala.Unit不一样吗?我在这里错过了什么?

有 3 个不同的实体:

1) 输入scala.Unit

2) 对象 () - class scala.Unit

的唯一成员

3) 对象 scala.Unit - 1) 的伴随对象。它是 class scala.Unit$ 的成员 - 与 scala.Unit.

不同

在你的第一个例子中 () 代表 1),在第二个例子中 Unit 代表 3)

为了回答您的问题,()scala.Unit 类型的值。而 scala.Unit 是伴生对象,所以它的类型是 Unit.type.

查看下面的 REPL 代码:

scala> (): scala.Unit
// (): scala.Unit

scala> scala.Unit
// res1: Unit.type = object scala.Unit

底线是您传递给协变列表的任何对象都会找到值的公共类型。请参阅 Why doesn't the example compile, aka how does (co-, contra-, and in-) variance work?

中的讨论

如您所见,Integerscala.Unit 的常见类型是 AnyValIntgerUnit.type的常见类型是Any.