Scala变量有多种类型

时间:2017-04-19 11:55:27

标签: scala

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.

有没有办法实现这个目标?

3 个答案:

答案 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,但希望这会有所帮助! :)