Scala列表中的混合类型

Scala列表中的混合类型,scala,Scala,我是Scala的新手,对于列表,似乎只允许一种类型的值,但以下代码运行正常: thrill = "Will" :: "fill" :: "until" :: 3 :: Nil println(thrill) List(Will, fill, until, 3) 即便如此: val thrill = "Will" :: "fill" :: "until" :: (1,2,3,4, (1,2,3)) :: Nil println(thrill) List(Will, fill, until, (1

我是Scala的新手,对于
列表
,似乎只允许一种类型的值,但以下代码运行正常:

thrill = "Will" :: "fill" :: "until" :: 3 :: Nil
println(thrill)
List(Will, fill, until, 3)
即便如此:

val thrill = "Will" :: "fill" :: "until" :: (1,2,3,4, (1,2,3)) :: Nil
println(thrill)
List(Will, fill, until, (1,2,3,4,(1,2,3)))

Scala如何从其元素推断出这种类型的列表?如何打印列表的类型?

如果要在运行时获取对象的类型,而您不在REPL中,可以使用以下简单函数:

def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]
另见。定义此函数后,可以调用

println(manOf(thrill))
打印您要查找的信息

代码工作的原因是列表可以有一个非常通用的类型,如
list[AnyRef]
list[Any]
。后者允许您存储列表中的任何内容。scala编译器在类型推断方面非常聪明,它会根据您的参数选择最具体的类型参数

如果将新元素附加到不可变列表(默认情况下为不可变),则将得到一个新列表,该列表可能具有新的(更一般的)类型

示例

val l = List(1)
将给您一个
列表[Int]
。添加这样的双元素

val l2 = 1.0 :: l

为您提供一个类型为
list[AnyVal]
的新列表。一般来说,编译器会选择列表中所有值的超类型作为最具体的类型。

要打印列表的类型,您可以在REPL中执行
type thrift
,第一个返回
Any
,第二个返回
java.io.Serializable
。@Brian的意思是
:type
。这是一个REPL命令,所以您需要冒号。Scala通过查找它们的最高公共超类型分母来推断类型。还有一点,但你可以这样想。