我对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?如何打印列表的类型?
答案 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]
的新列表。通常,编译器会选择最具体的类型,它是列表中所有值的超类型。