我对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)
}
答案 0 :(得分:3)
您只需在您的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")
答案 1 :(得分:1)
您的代码几乎按原样工作,但这不是因为存在某种“类型值运行时定义的变量”。相反,它之所以有效,是因为存在名为A
和B
的伴随对象,它们具有方法apply(s: String): A
和apply(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)
其工作原理相同。