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

问题描述 投票:0回答:1

让我们以通用的Array[T]类为例:


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

我的问题是,如果在编译时不知道类型String。而且您只有一个未知类型T的ClassTag,您仍然可以获得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]]

非常感谢您的意见!

scala template-specialization scala-reflect
1个回答
0
投票
def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ev.wrap

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

© www.soinside.com 2019 - 2024. All rights reserved.