【问题标题】:In scala, how to create a ClassTag of a specialised class using ClassTag of its generic member?在scala中,如何使用其泛型成员的ClassTag创建一个专门类的ClassTag?
【发布时间】:2019-12-21 22:37:10
【问题描述】:

我们以常见的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 类型没有被删除,因为 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]]

等等

非常感谢您的意见!

【问题讨论】:

    标签: scala template-specialization scala-reflect


    【解决方案1】:
    def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ev.wrap
    

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

    【讨论】:

    • 哇,这个函数名是骗人的:)
    • 不明显,当然,但这就是你查看签名的原因:)
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多