【问题标题】:Does the AnyVal with AnyRef as a parameter make sense in Scala?以 AnyRef 作为参数的 AnyVal 在 Scala 中是否有意义?
【发布时间】:2019-04-16 20:35:26
【问题描述】:

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

final case class Id(uuid: UUID) extends AnyVal

根据我对上述构造的理解,在 here 描述的某些场景中,不必实例化 Id。但是我有一些疑问,因为我没有找到任何以 AnyRef 作为参数的示例。

【问题讨论】:

  • 是的,它应该与AnyRefs 一起使用,请记住,在某些情况下它不起作用并且编译器最终会实例化一个类。但是,我从未见过它与 case class 一起使用,因为它通常与 implicit class 一起使用以提供零成本的扩展方法。
  • @LuisMiguelMejíaSuárez extends AnyVal 也用于案例类。
  • @DmytroMitin 哦,酷。你知道这是否仍然确保没有实例化?我假设它的作用是提供 case 类 以零成本提供 (如copy) 的所有方法?或者是什么意图?
  • @LuisMiguelMejíaSuárez 我猜defs 没问题。

标签: scala anyref


【解决方案1】:

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

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

值类在以下情况下实际实例化:

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

【讨论】:

  • 谢谢!因此,据我了解,将其用于 UUID 或字符串标识符的类型安全并用作数据而不是像 ad hoc polimorfism 那样是有意义的,对吗?
猜你喜欢
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多