在Scala中使用AnyRef作为参数的AnyVal是否有意义?

时间:2019-04-16 20:35:27

标签: scala anyref

下面的构造有意义吗?使用它有什么好处?

final case class Id(uuid: UUID) extends AnyVal

据我了解,上述结构在某些here场景中不必实例化ID。但是我有一些疑问,因为我没有找到任何使用AnyRef作为参数的示例。

1 个答案:

答案 0 :(得分:0)

是的,这个例子很有意义。当您想要某个类型的特定语义,但又不想支付随之而来的额外分配费用时,扩展AnyVal很有用。例如,假设您有一个用于输出值的字符串表示形式的typeclass实例,例如Show[A],并且想为UUID提供特定的语义,但是在其中已经存在Show[UUID]的实例范围是您无法控制的,这是在包装类型并为其引入隐式类型类时有用的。

请注意,AnyVal可能最终会在this documentation中提到的特定情况下分配包装器类的实例:

  

实际上在以下情况下实例化了一个值类:

     
      
  • 值类被视为另一种类型。
  •   
  • 将值类分配给数组。
  •   
  • 进行运行时类型测试,例如模式匹配。
  •