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