Scala 中 Tuple 和 List[Any] 的区别?

Difference between Tuple and List[Any] in Scala?

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

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

再说一次,书上说,"If you want to have any type of element in list/array, then you can use Any Datatype."

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

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

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

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

元组是类型安全的,对于 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

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

Any 是一个 数据类型 ,就像 IntString,但与它们不同。
Tuple 是一个 容器 ,它可以容纳多种数据类型,即它可以包含不同数据类型的值,但是 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 类型, 将被转换为单一数据类型 Any 并将丢失所有类型信息。

更新:
TupleList[Any] 的区别在于 Tuple 可以容纳多种数据类型的元素,仍然保持单个元素的数据类型。
ListArray 只能包含 单一 数据类型的元素,因此 List[Any] 将包含 [=11] 类型的所有元素=] ,因此它基本上会将所有元素(无论其早期数据类型如何)转换为 Any.

我不同意 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

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

元组的要点是一个函数能够 return 任意数量的不同类型的对象。这比每次需要 return 多个值时创建 class 更轻,但会牺牲一些类型安全性。