Scala中的元组和列表[Any]之间的区别?

Ra *_* Ka 3 scala scala-collections

目前,我正在学习Scala并阅读本书" Scala编程",其中写道:"与数组或列表不同,元组可以容纳不同类型的对象." 例如,以下元组包含Int,String和Float.

val tup = (1, "hello", 4.4)
Run Code Online (Sandbox Code Playgroud)

同样,该书说,"如果你想在列表/数组中有任何类型的元素,那么你可以使用任何数据类型."

val list = List[Any](1, "hello", 4.4)
Run Code Online (Sandbox Code Playgroud)

那么,这两种方法之间的区别是什么?一个人比另一个人有什么好处?

Yan*_*kee 8

Any是一种数据类型,就像Intor一样String,但与它们不同。
Tuple是一个容器,它可以容纳多种数据类型,即它可以包含不同数据类型的 vals,但 的类型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)
Run Code Online (Sandbox Code Playgroud)

但是Tuple将保持中每个元素的类型。Any另一方面,就像一个同源数据类型,其中元素没有唯一的类型标识,无论是最初的aStringInt还是Null类型,都将转换为单个数据类型Any,并将丢失所有类型信息。

更新:
一个之间的差异TupleList[Any]是一个Tuple可容纳多个数据类型的元素,仍保持各个元件的数据类型。
虽然 a ListorArray只能保存单一数据类型的元素,因此 aList[Any]将由type的所有元素组成Any,因此它基本上会将所有元素(无论它们之前的数据类型如何)转换为Any.


Ale*_*nov 7

tup有类型(Int, String, Double),所以你可以用正确的类型获取数据:tup._1有类型Int.list有类型List[Any],所以你丢失了所有类型信息:list(0)的类型是Any.

除非必须,否则不要使用Any(或List[Any]等); 当元组会这样做时,当然不要使用它.