我尝试编写通用apply
方法作为子类的工厂方法。我想出的是:
trait A
object A {
def apply[T <: A](someParam: String): T {
new T()
}
}
class B private extends A
class C private extends A
因此可以创建新的B或C实例:
def main(args: Array[String]): Unit = {
A[B]("test")
}
trait是否可以接受对象?是否有更好的方法来实现它?
答案 0 :(得分:3)
你可以:
trait A
object A {
def apply[T <: A ](someParam: String) (implicit ev: ClassTag[T]): T ={
ev.runtimeClass.newInstance().asInstanceOf[T]
}
}
但是对于每个子类
,它对于不同的构造函数来说并不是很有用 sealed trait A
object A {
def apply[T <: A](someParam: String)(implicit ev: T): T = {
ev
}
}
class B(n: Int) extends A
class C(n: String) extends A
object B {
implicit def defaultCons: B = new B(1)
}
object C {
implicit def defaultCons: C = new C("hi")
}
或者您也可以通过ClassTag
方法与基于类的模式匹配相结合而不是使用反射进行实例化。