Scala中伴随特征的对象

时间:2017-07-21 15:28:46

标签: scala

我尝试编写通用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是否可以接受对象?是否有更好的方法来实现它?

1 个答案:

答案 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方法与基于类的模式匹配相结合而不是使用反射进行实例化。