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



我是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]()

而factory的类型为A1Factory

这能做到吗?

可以通过告诉编译器使用隐式classstag保留运行时类型:

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()
    }
}

相关内容

  • 没有找到相关文章

最新更新