不了解ClassTag和Array Creation

时间:2017-08-16 00:43:01

标签: scala

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] ]

2 个答案:

答案 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)

该信息在运行时从类型擦除中丢失,但在编译时不会丢失。