在我的代码中,我有这样的东西:
trait MyObj
trait Companion {
type C <: MyObj
}
然后我有几对类和伴生对象,其中伴生对象扩展了 Companion,类扩展了 MyObj 并定义了一个带有 String 参数的构造函数。我不能只让案例类继承自 MyObj,因为我不能让同伴扩展同伴,但我最终在每个同伴中重复相同的代码:
class Foo(name: String) extends MyObj
object Foo extends Companion {
type C = Foo
def apply(name: String) = new Foo(name)
// new C(name) works too
}
我想将 apply 的实现转移到 Companion 特征:
trait Companion {
type C <: MyObj { def this(name: String) }
def apply(name: String) = new C(name)
}
现在继承对象只需要指定 C 的类型。但这不会编译。有什么方法可以告诉编译器 C 必须有一个特定的构造函数,这样我就可以调用 new C,而不必手动求助于反射?