Luk*_*Feo 0 functional-programming scala discriminated-union scala-collections
在 Scala 中是否有可能有一个联合类型的集合。有几个方法联合类型讨论这里最精彩的答案感觉最原生的,我有这样的事情:
sealed trait StringOrNumber[T]
object StringOrNumber {
implicit object IntWitness extends StringOrNumber[Int]
implicit object StringWitness extends StringOrNumber[String]
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试制作包含两者的地图时
val m: Map[String, Any] = Map("str" -> "hellp", "int" -> 32)
Run Code Online (Sandbox Code Playgroud)
scala 编译器将其视为 [String,Any] 的映射 有没有办法告诉 Scala 编译器这是一个映射 [String, StringOrNumber]
编辑:
我不认为使用上述方法可以创建字符串或联合的集合。我认为它需要是联合类型的另一种方法,因为上述类似于重载方法而不是类型系统中的真正联合类型
在当前版本的 Scala 中,最接近运行时联合类型的模拟是包装联合类型,以防类扩展某些密封特征。它是样板文件,并在AnyRef类型上添加了一个额外的包装层,但它有效,它比仅使用更好Any,您还可以从联合类型添加隐式转换:
sealed trait StringOrNumber
object StringOrNumber {
case class IsNumber(i: Int) extends StringOrNumber
case class IsString(s: String) extends StringOrNumber
implicit def isNumber(i: Int): StringOrNumber = IsNumber(i)
implicit def isString(s: String): StringOrNumber = IsString(s)
}
Run Code Online (Sandbox Code Playgroud)
现在您可以定义您的Map:
scala> val m: Map[String, StringOrNumber] = Map("str" -> "hellp", "int" -> 32)
m: Map[String,StringOrNumber] = Map(str -> IsString(hellp), int -> IsNumber(32))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1007 次 |
| 最近记录: |