[英]Don't understand ClassTag and Array Creation
ClassTag仅保留类型参数的顶级类型,即给定以下类型: Seq[List[Int]]
,类型参数为List[Int]
,但仅保留List
且Int
丢失
def mkArray[T: ClassTag](data: T*) = Array(data: _*)
val data = Seq(List(1), List(2), List(3))
val arr = mkArray(data)
在调用mkArray
创建数组时,应该丢失Int
for List[Int]
,因此为什么创建的数组具有其元素的正确类型,即List [Int]
底层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))
该信息会在运行时从类型擦除中丢失,但不会在编译时丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.