Scala 为类型分配一个动态值

Scala assign type a dynamic value

我是 Scala 的新手,我想知道是否可以通过某种方式动态创建类型。实际上我想要实现的是这样的:

trait BaseAB
case class A(value: String) extends BaseAB
case class B(value: String) extends BaseAB

def build(name: String, m: String): BaseAB = {
  type t = name match {
    case "A" => A
    base "B" => B
  }
  new t(m)
}

您可以在 case 子句中创建新实例,例如

case "A" => A(m)
case "B" => B(m)

或者您可以创建表示构造函数的部分应用函数,然后提供值

def build(name: String, m: String): BaseAB = {
  val construct = name match {
    case "A" => A.apply _
    case "B" => B.apply _
  }
  construct(m)
} 

> build("A", "boo") 
res25: BaseAB = A("boo")

您的代码几乎按原样工作,但这并不是因为有某种 "type-valued runtime-defined variables"。相反,它之所以有效,是因为有名为 AB 的伴随对象,它们具有方法 apply(s: String): Aapply(s: String): B,并且都符合类型 String => BaseAB:

trait BaseAB
case class A(value: String) extends BaseAB
case class B(value: String) extends BaseAB

def build(name: String, m: String): BaseAB = {
  val t = name match {
    case "A" => A
    case "B" => B
  }
  t(m)
}

在此代码片段中,t 的类型被推断为 String => BaseAB(可能带有一些额外的标记特征,例如 Serializable)。

如果确定只有"A""B",也可以写成

  (if (name == "A") A else B)(m)

出于同样的原因,它也有效。