scala - 在值类上使用私有(private)构造函数是否会抵消值类的好处?

标签 scala value-class

我正在考虑制作一个值类,该类对如何实例化它有一些保护措施。举个例子,假设我想要一个非负整数:

class NonNegInt private (val value: Int) extends AnyVal

object NonNegInt {
  def apply(value: Int): Try[NonNegInt] = Try {
    if (value >= 0) new NonNegInt(value) else throw new IllegalArgumentException("non-negative integers only!")
  }
}

我唯一担心的是私有(private)构造函数可能使 scala 编译器无法将 NonNegInt 视为原始 int。这是真的吗?

最佳答案

如果这里的“视为原语”意味着“避免分配”,那么这确实行不通,但不是因为私有(private)构造函数。

Value Classes Guide 中所述

此规则的另一个实例是将值类用作类型参数。例如,即使是对身份的调用,也必须创建实际的 Meter 实例。

def identity[T](t: T): T = t
identity(Meter(5.0))

基本上,因为 identity[T] 是参数化的,所以在值类型上调用它需要分配一个实例。 Try[T] 是相同的情况:Try { ... } "block"是参数化函数 Try.apply[T] 的调用,其中 T 是 NonNegInt。此调用将需要分配 NonNegInt 实例。

关于scala - 在值类上使用私有(private)构造函数是否会抵消值类的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711532/

相关文章:

对于具有部分函数参数方法的基类型,Scala 值类编译失败

java - 基于值的类混淆

java - 在 Java 中使用 Kotlin 值类

scala - 如何在 Scala 中定义特定容器类型的方法?

function - Scala 编译器在请求第二个参数集中的函数时提示 "ambiguous reference to overloaded definition"

Scala:将表格绘制到控制台

scala - 为什么 scala value class#toString 包含案例类信息?

java - Slick 中的 transient 等效项

scala - 如何在spark ml中定义特征列

scala - 值类引入了不需要的公共(public)方法