从scala中的模式匹配创建类型

从scala中的模式匹配创建类型,scala,types,pattern-matching,Scala,Types,Pattern Matching,我刚刚使用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

这只是一个例子,因为我想处理更复杂的结构,但给出了我想要做什么的想法。

出于基本的概念原因,我担心这是不可能的。由于类型规则是在编译时检查的,所以不可能基于在运行时之前可能未知的值派生类型

也就是说,您可以通过定义一个族来解决设计问题,每个族都是特定类型值的包装器。通过为这些类提供公共基类,您可以将任何类型的值存储到同一变量中,并通过类型安全模式匹配将其提取:

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) => …
  …
}

我可能不明白你在做什么,但这对我来说似乎有问题:

val test5 : defType = 4
编译器需要能够在编译时知道
defType
,否则无法进行类型检查。基于此,我认为您要做的是在编译时利用


然而,我觉得这也不是正确的解决方案,因为整个场景看起来很奇怪。如果您能更详细地说明您正在尝试做的事情的大局,也许我们可以建议一个更好的解决方案。

模式匹配是一种运行时机制,这是不可能的。查看Scala宏有人指出您的案例类需要扩展
Base
——但在我接受编辑之前,编辑被拒绝了。@DaoWen谢谢,我忘记了
extends
子句。我编辑了答案。