Scala Don';我不理解类标签和数组的创建

Scala Don';我不理解类标签和数组的创建,scala,Scala,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创建数组时,List[Int]的Int应该已经丢失了,那么为什么创建的数组具有正确的元素类

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
创建数组时,
List[Int]
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))

一个可能的解释是你错了“它应该已经丢失了”。。。你考虑过吗?像“duh…不,它不应该”谢谢@joe-k,但是数组创建是在运行时进行的?数组创建是在运行时进行的,但是数组不需要知道它存储的是什么类型的对象才能存储它们。从技术上讲,在运行时它只保存内存地址。谢谢@joe-k。关于你的解释,这让我觉得根本不需要类标签,因为创建的数组只保存内存地址。对不起,如果我头昏眼花,但我真的不太理解。