scala中有Either
,它允许变量具有2种类型的值。
val x: Either[String, Int] = Left("apple")
但是,我希望变量x有两种以上的类型,例如{String, Int, Double, List[String] }
。
e.g. val x:[type can be either String, Int, Double or List[String]]
//So that I can store either String, Int, Double, List[String] value in x.
有没有办法实现这个目标?
答案 0 :(得分:19)
IMO最自然的表达方式是创建一个ADT(代数数据类型):
sealed trait Foo
final case class Bar(s: String) extends Foo
final case class Baz(i: Int) extends Foo
final case class Fizz(d: Double) extends Foo
final case class Buzz(l: List[String]) extends Foo
现在你可以在Foo
上进行模式匹配:
val f: Foo = ???
f match {
case Bar(s) => // String
case Baz(i) => // Int
case Fizz(d) => // Double
case Buzz(l) => // List[String]
}
答案 1 :(得分:10)
看看无形coproducts
“shapeless有一个Coproduct类型,Scala的Either to to 任意数量的选择“
答案 2 :(得分:4)
不确定您的具体用例是什么,但请查看:scala type alias - how to have a type that represent multiple data types
基本上你创建一个特征表示一个伞形/父类。然后定义多个扩展父特征的类,并将父特征作为预期参数类型放在函数中。然后,您可以传递任何扩展该父特征的类型。
您必须包装子类型,但这允许您有一种代表多种类型的类型。
另一种方法可能是使用泛型类型和类型边界。这些文章讨论了这两个主题:
我还在学习Scala,但希望这会有所帮助! :)