ClassTag仅保留type参数的顶级类型,即,给定以下类型:Seq[List[Int]]
,类型参数为List[Int]
,但仅保留List
并且{ {1}}丢失了
Int
调用def mkArray[T: ClassTag](data: T*) = Array(data: _*)
val data = Seq(List(1), List(2), List(3))
val arr = mkArray(data)
创建数组时,mkArray
的{{1}}应该已经丢失,那么为什么创建的数组具有正确的元素类型,即List [Int] ]
答案 0 :(得分:2)
底层Java数组在运行时知道其元素的擦除类型。编译器知道编译时的精确时间。
scala> val xs = Array(List(1))
xs: Array[List[Int]] = Array(List(1))
scala> xs.getClass.getComponentType
res0: Class[_] = class scala.collection.immutable.List
scala> val vs = xs.asInstanceOf[Array[List[String]]]
vs: Array[List[String]] = Array(List(1))
scala> vs(0) = List("hi")
scala> xs
res2: Array[List[Int]] = Array(List(hi))
答案 1 :(得分:0)
该信息在运行时从类型擦除中丢失,但在编译时不会丢失。