我是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 。
可以这样做吗?
答案 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()
}
}