1

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

从 Scala 的文档中,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类型,一切都可以简化为它。

请说清楚

4

1 回答 1

11

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

它也不总是只解决 Any 。假设您有一个名为 Vehicle 的类和两个从它继承的名为 Bike 和 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 中的默认列表不是。如果您想了解更多,可以在Covariance, Invariance 和 Contravariance 中找到更详细的解释,用简单的英语解释?

于 2013-02-02T18:26:35.220 回答