我想限制Scala类的创建以使用伴随对象构造函数:

case class Foo private (bar: String, baz: Int)

现在我不能使用 new 关键字;我只能像_592310那样创建一个foo . 但是,假设我想在对象创建时挂钩 apply 方法,以便在创建实例时提供一些附加功能 . 我可以在特质中做到这一点吗?

object Foo extends SpecialApply[Foo]

trait SpecialApply[C] {
  override def apply(args: ???) = ???
}

核心问题是,我似乎不知道特征中的构造函数参数类型( StringInt ) . 我可以把它们作为一个元组传递,比如说:

object Foo extends SpecialApply[(String, Int), Foo]

trait SpecialApply[A, C] {
  override def apply(args: ???) = <companion object>
}

或者我可以通过反思得到它们 . 无论哪种方式,我都不确定如何在元组上定义 apply 方法 .

是否有一些反射, .tupled 函数,宏和/或shapeless魔法的组合将使这个工作?