【问题标题】:Is scala.Unit not same as ()?scala.Unit 与 () 不同吗?
【发布时间】:2018-11-23 09:42:24
【问题描述】:

我从 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 不一样吗?我在这里想念什么?

【问题讨论】:

    标签: scala hierarchy


    【解决方案1】:

    要回答您的问题,()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

    【讨论】:

      【解决方案2】:

      有 3 个不同的实体:

      1) 输入scala.Unit

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

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

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

      【讨论】:

      • 伴生对象的类型更正确地给出为Unit.type,因为它是与值Unit 关联的单例类型。类被称为Unit$ 的事实更多的是实现细节。
      • @HTNW 是的,你是对的。但我认为在问题的上下文中挖掘类和类型之间的差异会令人困惑。
      猜你喜欢
      • 1970-01-01
      • 2013-05-16
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多