我想限制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: ???) = ???
}
核心问题是,我似乎不知道特征中的构造函数参数类型( String
和 Int
) . 我可以把它们作为一个元组传递,比如说:
object Foo extends SpecialApply[(String, Int), Foo]
trait SpecialApply[A, C] {
override def apply(args: ???) = <companion object>
}
或者我可以通过反思得到它们 . 无论哪种方式,我都不确定如何在元组上定义 apply
方法 .
是否有一些反射, .tupled
函数,宏和/或shapeless魔法的组合将使这个工作?