在Scala中,如何从其伴随对象访问案例类的私有构造函数

cha*_*ium 1 constructor scala private-methods companion-object

我定义了以下代码(在Scala IDE/Scala工作表中使用Scala 2.10):

object WorkSheet1 {
  object A {
    def apply(s: String, huh: Boolean = false): A = A(s)
  }
  case class A (s: String)
  //case class A private (s: String)
  val a = A("Oh, Hai")
}
Run Code Online (Sandbox Code Playgroud)

我成功收到以下输出:

a:public_domain.WorkSheet1.A = A(哦,海)

但是,当我注释掉现有的case class A (s: String)并取消注释掉另一个(包含" private ")时,我收到以下编译器错误:"在对象WorkSheet1中无法访问类A中的构造函数A".

我的理解是,一个伴侣对象可以访问它所有的伴侣类的私有部分.嘿.呃......说真的.是什么赋予了?

om-*_*nom 5

除了As之外,任何人都可以使用它

object WorkSheet1 {
  object A {
    def apply(s: String, huh: Boolean = false): A = A(s)
  }
  case class A private[A](s: String)
  val a = A("Oh, Hai", false)
}
Run Code Online (Sandbox Code Playgroud)

我添加了false来解决对象apply和case类构造函数之间的歧义,这是公开可见的.

  • 或者将`A(s)`更改为`new A(s)`以明确要求调用构造函数而不是`apply` (2认同)