scala - Scala 列表中的混合类型

标签 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?如何打印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/

相关文章:

scala - Seq[A] 扩展 Ordered[Seq[A]]

scala - Spark RDD 在每个分区内具有共享指针(以及魔数(Magic Number) 200??)

java - 用于字符串处理的 Akka 分散-聚集

scala - 使用 I18n : two languages in the same page 播放框架 2.4.0

scala - 折叠左单行中的类型推断?

scala - 通过最短路径链接隐式

java - 从Scala访问HBase时发生了非法的反射访问操作

scala - 有没有办法将上下文信息传递给解析器?

scala - AnyVal 子类型存储在 Scala 中的什么位置?

scala - 自动散列 Consed 案例类