使用Scala的反射API进行动态工厂类实例化

时间:2013-06-14 15:46:43

标签: scala reflection scala-2.10

我是Scala反射功能的新手。我想知道是否可以构建一个工厂对象,根据类型参数提供不同类的实例化。

下面的代码不起作用,但它以最小的例子描述了我想要实现的目标。我遗漏了A1Factory和A2Factory的代码,因为它们在这里没关系。

sealed abstract class A

class A1 extends A

class A2 extends A

object Factory {
  def apply[T <: A]() = {
    classOf[T] match {
      case x: A1 => new A1Factory()
      case x: A2 => new A2Factory()
    }
  }
}

我希望能做的是这样的事情:

type currentType = A1
val factory = Factory[currentType]()

工厂属于 A1Factory

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

可以告诉编译器使用隐式ClassTag来保留运行时类型:

object Factory {
    def apply[T <: A]()(implicit tag: ClassTag[T]) = {
    val A1 = classOf[A1]
    val A2 = classOf[A2]
    classTag[T].runtimeClass match {
        case A1 => new A1Factory()
        case A2 => new A2Factory()
    }
}