在 Scala 2.10 中,如何在给定 TypeTag 的情况下创建 ClassTag

2024-03-19

我想定义一个返回数组的函数,并且我有一个 TypeTag。我可以生成所需的 ClassTag 吗?

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10)
<console>:11: error: No ClassTag available for X
       def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10)

或者是否有必要提供ClassTag的隐含证据:

scala> import reflect.ClassTag
import reflect.ClassTag

scala> def fun[X: ClassTag: TypeTag]: Array[X] = Array.ofDim[X](10)(implicitly[ClassTag[X]])
fun: [X](implicit evidence$1: scala.reflect.ClassTag[X], implicit evidence$2: reflect.runtime.universe.TypeTag[X])Array[X]

我本以为从 TypeTag 生成 ClassTag 很简单,但我没有看到明显的方法。


我很想看到一个更简单的解决方案,但这是我想出的:

def fun[X:TypeTag]: Array[X] = {
  val mirror = runtimeMirror(getClass.getClassLoader)
  implicit val xClassTag = ClassTag[X]( mirror.runtimeClass( typeTag[X].tpe ) )
  Array.ofDim[X](10)
}

您需要确保您确实需要通过TypeTag首先。你不能通过一个ClassTag相反(如def fun[X: ClassTag]) ?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Scala 2.10 中,如何在给定 TypeTag 的情况下创建 ClassTag 的相关文章

随机推荐