在 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]]
。
我们以常见的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]]
。