scala.Unit与()不同吗?

时间:2018-11-23 09:42:25

标签: scala hierarchy

我从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???

我看到list1的类型为AnyVal,其中list2的类型为Any,即使它们具有相同的数据(我假设)。

()Scala.Unit不同吗?我在这里想念什么?

2 个答案:

答案 0 :(得分:5)

为回答您的问题,()是类型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

答案 1 :(得分:4)

有3个不同的实体:

1)键入scala.Unit

2)对象()-类scala.Unit的唯一成员

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

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