无法在 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 上面提到的,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
只是 ::
的 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
我尝试获取变量的运行时类型(不是引用的类型),即我在 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 上面提到的,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