在斯卡拉2.10,你如何创建一个ClassTag给予TypeTag(In Scala 2.10, h

2019-08-17 04:50发布

我想定义返回数组的函数,和我有一个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,但我看不出有什么明显的方式。

Answer 1:

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

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]



文章来源: In Scala 2.10, how do you create a ClassTag given a TypeTag