我想限制创建Scala类以使用伴随对象构造函数:
case class Foo private (bar: String, baz: Int)
现在我不能使用new
关键字;我只能创建一个像Foo("catch", 22)
这样的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魔术的某种组合才能使这项工作奏效?