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

时间:2016-12-01 07:07:30

标签: scala scala-collections

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

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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

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类型,将转换为单个数据类型Any,并将丢失所有类型信息。

<强>更新
TupleList[Any]之间的区别在于Tuple可以保存多种数据类型的元素,仍然保留各个元素的数据类型。
虽然ListArray只能包含数据类型的元素,但List[Any]将包含Any类型的所有元素,所以它基本上将所有元素(不论其早期的数据类型)转换为Any

答案 2 :(得分: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]。

答案 3 :(得分:0)

我不同意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 of Array中的项时,不需要强制转换。当然,我对使用这种东西的代码设计持怀疑态度。

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