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 的东西。这个不起眼的名字是什么意思?

最佳答案

这是因为 List 是一个密封的父类(super class),它覆盖了 case 类 :: 和对象 Nil (请参阅 List 文档下的已知子类部分)。 :: 发音为 cons,以大多数传统函数式编程语言中的 list cons 运算符命名。

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

更新: 我不太确定你想用类名做什么,但你可以改用 stringPrefix 。它是为扩展 GenTraversableLike 的任何东西定义的,它几乎适用于所有 Scala 集合类型。

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

xs match {
  list: List[_] => // do list stuff
  set: Set[_] => // do set stuff
}

关于scala - 来自对象的奇怪类名的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13184531/

10-12 23:14