ケースクラスを使用してスマートコンストラクターを実装しようとしています。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
そんなことはありえないのではないでしょうか?