我可以从Scala特性中覆盖伴随对象的`apply`方法吗?

时间:2018-12-06 17:40:06

标签: scala shapeless

我想限制创建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: ???) = ???
}

中心问题是,我似乎不知道特征中的构造函数参数类型(StringInt)。我可以像这样将它们作为元组传入:

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

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

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

是否存在反射,.tupled函数,宏和/或shapeless魔术的某种组合才能使这项工作奏效?

0 个答案:

没有答案