Scala列表中的对象类型

Jam*_*sev 0 types scala list

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

从Scala的文档来看,List

用于表示类型元素的有序集合的不可变链表的类.

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?!)
Run Code Online (Sandbox Code Playgroud)

似乎并非如此.毕竟Any它本身是一个有效的Scala类型,一切都可以减少到它.

请澄清

Seb*_*oek 10

您没有明确指定列表的类型,并且您放入了两种类型的对象,这使得它成为"Any"类型的列表似乎很方便,并且它不会破坏规则.如果你说过val l1: List[Int] = List(1,2,3, "oh really?!")它会是一个不同的情况(如:它会告诉你类型不匹配)

它并不总是只解决任何一个问题.假设你有一个名为Vehicle的类和两个继承它的类叫做Bike and Car.

val car = new Car
val bike = new Bike
val vehicleList = List(car, bike)
Run Code Online (Sandbox Code Playgroud)

vehicleList现在将是Vehicle类型.如果你只在那里放了一辆汽车或一辆自行车那么它就属于那种特定类型.

可选的背景信息:Scala中的List是协变的,这意味着如果Int和String是Any的子类型,则List [Int]和List [String]也是List [Any]的子类型.这意味着您可以拥有一个包含整数和字符串的列表,这是您的语句有效并自动生成List [Any]的原因.顺便说一句,这并不总是一个给定的事实,如果列表是可变的,实际上可能会导致麻烦.幸运的是,Scala中的默认List不是.如果您想了解更多信息,可以在协方差,不变性和反差数中找到更长的解释,用简单的英语解释?