在 scala 中,如何使用其通用成员的 ClassTag 创建专用 class 的 ClassTag?

In scala, how to create a ClassTag of a specialised class using ClassTag of its generic member?

我们以常见的Array[T]class为例:


import scala.reflect.ClassTag

{
    val t = implicitly[ClassTag[String]]
    val ts = implicitly[ClassTag[Array[String]]]

    Seq(t, ts).foreach(println)
}

这将给出以下输出:

java.lang.String
Array[java.lang.String]

可以观察到类型 String 没有被擦除,因为 Array 有一个专门的类型成员。

我的问题是,如果编译时不知道类型 String。而你只有一个未知类型的ClassTagT,你还能得到Array[T]的专用ClassTag吗?

例如

def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ...

这样:

arrayClassTagOf[String] == implicitly[ClassTag[Array[String]]
arrayClassTagOf[Int] == implicitly[ClassTag[Array[Int]]

等等

非常感谢您的意见!

def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ev.wrap

是的,这个确切的工作已经 def wrap: ClassTag[Array[T]]