无法在 Scala 中获取变量的运行时类型

Unable to get runtime type of a variable in Scala

我尝试获取变量的运行时类型(不是引用的类型),即我在 Scala 控制台中获得的输出:

scala> val data = Seq(1,2,3)
data: Seq[Int] = List(1, 2, 3)

我在这里感兴趣的是 Seq 的默认实现是 List.

如何在普通的 Scala 应用程序中获取此信息?

我试过了:

val data =  Seq(1,2,3)
println(data.getClass)

但这给了

class scala.collection.immutable.$colon$colon

编辑:看来我误解了 scala 控制台的输出。 List 不是运行时类型,而是确切的编译时类型。引用的类型是 Seq

它给出了正确的答案,只要 :: 是一个 class,用作实现

sealed abstract class List[+A]() extends scala.collection.AbstractSeq[A] with scala.collection.immutable.LinearSeq[A]

final case class ::[B](private val hd : B, private[scala] val tl : scala.collection.immutable.List[B]) extends scala.collection.immutable.List[B] 

就像@Sergey 上面提到的,ConsList

的子类
@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}

$colon$colon 只是 ::

的 toString

比如说,如果我创建一个名为

的函数
def :: ="hello"

编译器会将其转换为

 public String $colon$colon(){
    return "hello";
  }

参考资料: 1. https://github.com/scala/scala/blob/v2.12.1/src/library/scala/collection/immutable/List.scala#L1 2. http://www.scala-lang.org/api/2.12.1/scala/collection/immutable/List.html