我尝试获取变量的运行时类型(不是引用的类型),即我在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
答案 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一样,Cons
是List
的子类
@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
只是::
说,如果我创建一个名为
的函数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