В Scala 2.10, как вы создаете ClassTag с учетом TypeTag

Я хотел бы определить функцию, которая возвращает массив, и у меня есть 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]

Я бы подумал, что просто создать ClassTag из TypeTag, но я не вижу очевидного способа.

Ответ 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])?