2013-02-02 29 views
0

我的印象是,Scala列表中的每個對象都必須具有相同的類型,並且如果我們需要擁有不同類型的某個集合,則應使用元組。Scala的列表中的對象的類型

從Scala的documentation類型的 元素,List

一類不可變的鏈表代表有序集合。

scala> val l1 = List(1,2,3) 
l1: List[Int] = List(1, 2, 3) 

scala> val l1 = List(1,2,3, "oh really?!") 
l1: List[Any] = List(1, 2, 3, oh really?!) 

這似乎並不如此。畢竟Any本身是一個有效的Scala類型,一切都可以減少到它。

請澄清

+0

'List [T]'中找到更長的解釋,可能包含任何類型與「T」兼容的值,而不僅僅是那些完全是「T」的值。當你編寫一個'List'這樣的文字時,例如List(1,2,3,「string」)',編譯器就會發現一個超類型,它包含了參數中所有值的類型。當你將'AnyVal'(原始類型)和'AnyRef'(類類型)混合在一起時,唯一常見的超類型是'Any',這就是你的第二個例子中發生的事情。 –

回答

10

你沒有明確指定列表的類型,你把兩種類型的對象,似乎方便,這使得這種類型的「任意」名單,並沒有打破常規。 如果你說val l1: List[Int] = List(1,2,3, "oh really?!")它會是一個不同的情況下(如:它會告訴你有一個類型不匹配)

它並不總是隻是解決任何一個。 考慮你有一個名爲Vehicle的類和兩個繼承它的類,稱爲Bike和Car。

val car = new Car 
val bike = new Bike 
val vehicleList = List(car, bike) 

vehicleList現在將是Vehicle類型。如果你只在那裏放置一輛汽車或一輛自行車,那麼它就是那種特定的類型。

可選背景信息:Scala中的列表是協變的,這意味着如果Int和String是Any的子類型,則List [Int]和List [String]也是List [Any]的子類型。這意味着您可以擁有一個包含整數和字符串的列表,並且是您的語句有效並自動生成List [Any]的原因。這並不總是一個給定的事實,如果列表是可變的,實際上可能會導致麻煩。幸運的是,Scala中的默認列表不是。如果您想了解更多信息,可以在Covariance, Invariance and Contravariance explained in plain English?

+0

我不會推斷任何'方便'的最小上界。這通常意味着你做錯了什麼,這就是爲什麼在Scala中有這樣的警告。 – eriksensei

+0

也許是這樣,但是他的問題表達的方式表明他並沒有指望它可能在列表中有不同的類型,這就是我所說的'方便',比如在我的車輛示例中。 –