ade*_*rtc 1 scala case-class companion-object
尝试使用案例类实现智能构造函数。设法copy很好地覆盖了该方法,并且我认为apply伴随对象中的 应该可以解决问题,但是在尝试传入BigInt. 我尝试放入def apply(value: BigInt): Option[Natural]但随后scalac抱怨符号冲突。
import spire.math.Integral // companion object contains implicit Integral[BigInt]
case class Natural private (value: BigInt) {
def copy(value: BigInt = this.value): Option[Natural] =
Natural.apply(value)
}
object Natural {
def apply[A](x: A)(implicit A: Integral[A]): Option[Natural] =
if (A.isPositive(x)) Some(Natural(x))
else None
}
/** In Foo.scala */
Natural(5L) // Option[Natural] = Some(Natural(5))
Natural(BigInt(5L)) // constructor Natural in class Natural cannot be accessed in object Foo
Run Code Online (Sandbox Code Playgroud)
也许这样的事情是不可能的?
正如@jroesch 在他的回答中指出的那样,重载是你的问题。
解决这个问题的方法是改变私有主构造函数的参数类型,使后者不能与公共工厂方法冲突。在 Scala 中有多种方法可以做到这一点……一个可能是这样的,
case class Wrap[T](t: T) extends AnyVal
case class Natural private (value: Wrap[BigInt]) {
def copy(value: Wrap[BigInt] = this.value): Option[Natural] =
Natural(value.unwrap)
}
object Natural {
def apply[A](x: A)(implicit A: Integral[A]): Option[Natural] =
if (A.isPositive(x)) Some(Natural(Wrap(x)))
else None
}
Run Code Online (Sandbox Code Playgroud)