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

时间:2017-01-30 10:28:37

标签: scala types runtime

我尝试获取变量的运行时类型(不是引用的类型),即我在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

2 个答案:

答案 0 :(得分:4)

它给出了正确答案,因为::是一个类,用作实现

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] 

答案 1 :(得分:1)

就像上面提到的@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";
  }

enter image description here

参考文献: 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