Scala列表中的混合类型

时间:2016-01-31 05:50:06

标签: scala

我对Scala更新,对于List,似乎只允许一种类型的值,但是在代码运行正常之后:

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如何从元素中推断出这种类型的List?如何打印列表的类型?

1 个答案:

答案 0 :(得分:2)

如果你想在运行时获取一个对象的类型而你不在REPL中,你可以使用这样一个简单的函数来完成它:

def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]

另见this answer。定义此功能后,您可以调用

println(manOf(thrill))

打印您要查找的信息。

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

如果将新元素附加到不可变列表(默认为immutable),您将获得一个可能具有新(更常规)类型的新列表。

示例

val l = List(1)

会给你一个List[Int]。添加像这样的双元素

val l2 = 1.0 :: l

为您提供类型为List[AnyVal]的新列表。通常,编译器会选择最具体的类型,它是列表中所有值的超类型。