3
object Initialization {

  def main(args: Array[String]): Unit = {

    val list = Traversable(1,2,4,5)

    //list.foreach(println)

    println( list.getClass.getSimpleName )

  }

}

它可以打印$colon$colon,但我预计会出现类似List. 这个不起眼的名字是什么意思?

4

1 回答 1

6

这是因为List它是一个密封的超类,它位于案例类::和对象之上Nil(请参阅List 文档下的已知子类部分)。::发音为cons,以大多数传统函数式编程语言中的列表 cons 运算符命名。

由于您的列表头实际上是案例类的一个实例::,并且 Scala 使用名称修饰来表示 JVM 上的非单词类名称,因此您最终$colon$colon会使用反射来获取名称。

更新:我不确定您要使用类名做什么,但您可能可以使用它stringPrefix。它是为任何扩展定义的GenTraversableLike,这几乎是每个 Scala 集合类型。

如果您尝试使用类名进行控制流,您可能应该尝试其他方法。模式匹配会很好地工作,例如:

xs match {
  list: List[_] => // do list stuff
  set: Set[_] => // do set stuff
}
于 2012-11-01T19:58:31.113 回答