我是使用 Scala 的新手,我需要的是基于一些模式匹配函数创建一个动态类型,比如
type defType = "value1" match {
case "value0" => typeOf[String]
case "value1" => typeOf[Integer]
case _ => typeOf[Double]
}
val test5 : defType = 4
这只是一个示例,因为我将使用更复杂的结构,但给出了我想要做什么的想法。
我是使用 Scala 的新手,我需要的是基于一些模式匹配函数创建一个动态类型,比如
type defType = "value1" match {
case "value0" => typeOf[String]
case "value1" => typeOf[Integer]
case _ => typeOf[Double]
}
val test5 : defType = 4
这只是一个示例,因为我将使用更复杂的结构,但给出了我想要做什么的想法。
我可能不明白你在做什么,但这对我来说似乎有问题:
val test5 : defType = 4
defType
编译器需要在编译时能够知道,否则无法进行类型检查。基于此,我认为您想要做的是在编译时使用Scala 宏进行这种模式匹配。
但是,我觉得这也不是正确的解决方案,因为整个场景看起来很奇怪。如果您提供更多有关您正在尝试做的事情的更大图景的详细信息,也许我们可以提出更好的解决方案。
由于基本的概念原因,我担心这是不可能的。由于在编译时检查类型规则,因此不可能基于在运行时之前可能未知的值派生类型。
话虽如此,您可以通过定义一系列案例类来解决您的设计问题,每个案例类都是特定类型值的包装器。通过为这些类提供一个公共基类,您可以将您希望的任何类型的值存储到同一个变量中,并通过类型安全的模式匹配提取它:
class Base
case class AString(val value: String) extends Base
case class AnInt(val value: Int) extends Base
case class ADouble(val value: Double) extends Base
val a : Base = "value1" match {
case "value0" => AString(…)
case "value1" => AnInt(…)
case "value0" => ADouble(…)
}
a match {
case AString(s) => …
case AnInt(i) => …
case ADouble(i) => …
…
}