我是 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?如何打印List的类型?
最佳答案
如果您想在运行时获取对象的类型并且您不在 REPL 中,您可以使用如下简单函数来完成:
def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]
另请参阅this answer 。定义此函数后,您可以调用
println(manOf(thrill))
打印您要查找的信息。
您的代码有效的原因是列表可以具有非常通用的类型,例如 List[AnyRef]
或 List[Any]
。后者允许您存储列表中的任何内容。 scala 编译器对于类型推断非常智能,它会根据您的参数选择最具体的类型参数。
如果将新元素附加到不可变列表(默认为不可变),您将获得一个可能具有新(更通用)类型的新列表。
示例
val l = List(1)
会给你一个List[Int]
。像这样添加一个双元素
val l2 = 1.0 :: l
为您提供一个类型为List[AnyVal]
的新列表。一般来说,编译器会选择最具体的类型,它是列表中所有值的父类(super class)型。
关于scala - Scala 列表中的混合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35110799/