1

我是 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类型。

这可以做到吗?

4

1 回答 1

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()
    }
}
于 2013-06-14T17:01:08.527 回答