2017-04-19 106 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

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