【问题标题】:Types of objects in Scala's ListsScala 列表中的对象类型
【发布时间】:2013-01-17 20:36:40
【问题描述】:

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

来自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 类型,一切都可以简化为它。

请澄清

【问题讨论】:

  • List[T] 可以包含任何类型与T 兼容的值,而不仅仅是那些完全是T 的值。当您编写 List 文字(例如 List(1, 2, 3, "string"))时,编译器会找到一个包含参数中所有值的类型的超类型。当您混合来自AnyVal(原始类型)和AnyRef(类类型)的类型时,唯一常见的超类型是Any,这就是您的第二个示例中发生的情况。

标签: list scala types


【解决方案1】:

您没有明确指定列表的类型,而是放入了两种类型的对象,将其设为“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 and Contravariance explained in plain English?找到更详细的解释

【讨论】:

  • 我不会调用推断Any'方便'的最小上限。这通常意味着你做错了什么,这就是为什么在 Scala 中有一个警告。
  • 也许是这样,但他的问题表达方式表明他根本不希望列表中有不同的类型,这就是我所说的“方便”,例如在我的车辆示例中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多