【问题标题】:Difference between Tuple and List[Any] in Scala?Scala中元组和列表[Any]之间的区别?
【发布时间】:2016-12-01 07:07:29
【问题描述】:

目前,我正在学习 Scala 并阅读这本书 Programming in Scala,其中说:“与数组或列表不同,元组可以包含不同类型的对象。”例如,以下元组包含 Int、String 和 Float。

val tup = (1, "hello", 4.4)

再一次,这本书说,“如果你想在列表/数组中有任何类型的元素,那么你可以使用 Any Datatype。”

val list = List[Any](1, "hello", 4.4)

那么,以上这两种方法有什么区别呢?一个比另一个有什么好处?

【问题讨论】:

  • 键入Any 是出现问题的好兆头。避免它。

标签: scala scala-collections


【解决方案1】:

tup 的类型为 (Int, String, Double),因此您可以使用正确的类型取回数据:tup._1 的类型为 Intlist 的类型为 List[Any],因此您丢失了所有类型信息:list(0) 的类型是 Any

除非必须,否则不要使用Any(或List[Any]等);当元组可以使用时,当然不要使用它。

【讨论】:

  • 感谢您的准确回答。因此,使用 List[Any] 意味着,所有类型信息都将丢失。我会尽可能少地使用 Any 。谢谢。
【解决方案2】:

Any 是一个数据类型,就像IntString,但又有所不同。
Tuple 是一个容器 ,它可以容纳多种数据类型,即它可以包含不同数据类型的 val,但 Tuple 的类型将取决于 Tuple 中有多少元素,例如:

val tup = (1, "hello", 4.4) // type of tup here is scala.Tuple3 (Int, String, Double)
val tup = (2.3, null) // type of tup here is scala.Tuple2  (Double, Null)
val tup = (5:Any, "hello", 2.2) // type of tup here is scala.Tuple3 (Any, String, Double)

Tuple 中每个元素的类型将保持不变。另一方面,Any 就像一个本地数据类型,其中元素没有唯一的类型标识,最初是 StringIntNull 类型,将转换为单个数据-type Any 并且会丢失所有类型信息。

更新:
TupleList[Any] 之间的区别在于 Tuple 可以保存多种数据类型的元素,但仍保持各个元素的数据类型。
虽然 ListArray 只能保存 single 数据类型的元素,但 List[Any] 将包含 Any 类型的所有元素,因此它基本上会转换所有元素(不管它们早期的数据类型)到Any

【讨论】:

  • 比较是在元组和List[Any](或Array[Any]Seq[Any])之间,而不是在元组和Any之间:)
  • @AlexeyRomanov ,对不起,我的错。尽管我的回答也可能解释了这种差异,但我会对其进行编辑。感谢您指出:)
【解决方案3】:

元组是类型安全的,使用 List[Any] 您必须将元素转换为适当的类型。

val tup = (1, "hello", 4.4)
tup._2 --> gives you string

val list = List[Any](1, "hello", 4.4)
list(1) --> gives you object of type Any and you have to cast this object

您的元组是 Tuple3[Int, String, Double] 类型的类。

【讨论】:

  • 所以,List[Any] 不是类型安全的,如果使用的话会有转换开销。谢谢你的解释。
  • 老实说,不仅在大多数情况下强制转换的开销很小,编译器为元组(以及对于泛型的大多数用途)生成的代码也隐藏了强制转换。类型安全是唯一真正的问题,但它是一个非常大的问题。
【解决方案4】:

我不同意 PawelN

val list = List[Any](1, "hello", 4.4)
for (i <- list) println(i.getClass)

val array = Array[Any](1, "hello", 4.4)
for (i <- array) println(i.getClass)

结果:

class java.lang.Integer
class java.lang.String
class java.lang.Double

因此,当您访问 List 或 Any 数组中的项目时,不需要强制转换。当然,我会怀疑使用这种东西的代码设计。

元组的要点是,函数能够返回任意数量的不同类型的对象。这比每次需要以某种类型安全为代价返回多个值时创建一个类要轻得多。

【讨论】:

  • 这是错误的@Clem Wang。尝试对list = List[Any](1, "hello", 4.4)的项目做一些操作,你会发现。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 2021-01-30
  • 2015-08-11
  • 2021-02-01
  • 2020-12-09
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多