0

在我的代码中,我有这样的东西:

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,而不必手动求助于反射?

4

1 回答 1

1

添加ClassTagorTypeTag呢?它可以是某种针对反射的中间解决方案:

abstract class Companion[C <: MyObj](implicit ct:ClassTag[C]) {
  def apply(name: String):C = 
    ct.getConstructor(classOf[String]).invoke(Array[Any](name)).asInstanceOf[C]
}

(不确定确切的语法)

于 2013-11-13T06:22:49.080 回答