Ваш код работает почти как есть, но это не потому, что есть некие «типозначные переменные, определенные во время выполнения». Вместо этого это работает, потому что есть сопутствующие объекты, называемые 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)
работает по той же причине.