В Scala как получить доступ к приватному конструктору класса case из его сопутствующего объекта

У меня определен следующий код (в Scala IDE/Scala Worksheet с 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")
}

И я успешно получаю следующий вывод:

a: public_domain.WorkSheet1.A = A (О, Хай)

Тем не менее, когда я закомментирую существующий case class A (s: String) и раскомментировав другой (содержащий "private"), я получаю следующую ошибку компилятора: "конструктор A в классе A не может быть доступен в объекте WorkSheet1".

Насколько я понимаю, объект-компаньон имел доступ ко всем частным частям своего класса-компаньона. Хех. Э-э... серьезно. Что дает?

1 ответ

Решение

Сделайте это приватным для всех, кроме как

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)
}

Я добавил false, чтобы решить неоднозначность между объектом apply и конструктором класса case, который является публично видимым.

Другие вопросы по тегам