Scala列表中的对象类型

时间:2013-02-02 18:04:16

标签: list scala types

我的印象是,Scala列表中的每个对象必须具有相同的类型,如果我们需要具有不同类型的集合,则应使用元组。

来自Scala的documentationList

  

表示有序集合的不可变链表的类   类型的元素。

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类型,所有内容都可以缩减为它。

请澄清

1 个答案:

答案 0 :(得分:10)

您没有明确指定列表的类型,并且您放入了两种类型的对象,这使得它成为“Any”类型的列表似乎很方便,并且它不会破坏规则。 如果您曾说过val l1: List[Int] = List(1,2,3, "oh really?!"),那将是一个不同的情况(例如:它会告诉您类型不匹配)

它并不总是只解决任何一个问题。 假设你有一个叫做Vehicle的类和两个继承它的类叫做Bike and Car。

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

vehicleList现在将是Vehicle类型。如果你只在那里放了一辆汽车或一辆自行车那么它就属于那种特定类型。

可选的背景信息:Scala中的List是协变的,这意味着如果Int和String是Any的子类型,则List [Int]和List [String]也是List [Any]的子类型。这意味着您可以拥有一个包含整数和字符串的列表,这是您的语句有效并自动生成List [Any]的原因。顺便说一句,这并不总是一个给定的事实,如果列表是可变的,实际上可能会导致麻烦。幸运的是,Scala中的默认List不是。如果您想了解更多信息,可以在Covariance, Invariance and Contravariance explained in plain English?

找到更长的解释