2017-04-19 119 views
4

在斯卡拉有Either允许一个变量有2个类型的值。斯卡拉变量与多种类型

val x: Either[String, Int] = Left("apple") 

但是,我想有超过2种类型的变量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

*我想有超过2种类型的变量*。你能否详细说明实际上的含义,或者通过举例说明? –

+1

'要么[要么[[String,Int],Double],List [String]]' –

+0

@YuvalItzchakov我已经更新了答案。 –

回答

16

IMO表达这种最自然的方式是创建一个ADT(代数数据类型):

sealed trait Foo 
case class Bar(s: String) extends Foo 
case class Baz(i: Int) extends Foo 
case class Fizz(d: Double) extends Foo 
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] 
} 
+0

这可以解决我的问题,谢谢你的回答。 –

9

看不成形coproducts

“无形有一个Coproduct类型,Scala的泛化为 的选择”

+0

这似乎正是我想要的,但是,我现在将无法使用任何外部库,但将在稍后考虑。顺便说一句,它对了解它非常有帮助。谢谢。 –

4

不知道你的确切使用情况,但看看这个任意数:scala type alias - how to have a type that represent multiple data types

基本上你创建一个特质代表了一把伞/父类。然后定义扩展父特征的多个类,并将父特征作为函数中的预期参数类型。然后你可以传递任何延伸父母特质的类型。

您必须包装子类型,但是这允许您拥有一种代表多种类型的类型。

另一种方法可能是使用泛型类型和类型边界。这些文章谈论这两个科目:

我还在学习Scala,但希望这有助于! :)

+0

你的答案包含很多信息,非常有帮助。谢谢。 :) –