我从Scala hierarchy中看到,AnyVal
是scala.Unit
,Boolean
,Char
和其他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
不同吗?我在这里想念什么?
答案 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?
中的讨论您发现,Integer
和scala.Unit
的常见类型是AnyVal
。 Intger
和Unit.type
的常见类型是Any
。
答案 1 :(得分:4)
有3个不同的实体:
1)键入scala.Unit
2)对象()
-类scala.Unit
的唯一成员
3)对象scala.Unit
-1)
的伴随对象。它是scala.Unit$
类的成员-与scala.Unit
不同。
在您的第一个示例中,()
代表1)
,在第二个Unit
代表3)