【问题标题】:In Scala 2.10, how do you create a ClassTag given a TypeTag在 Scala 2.10 中,如何在给定 TypeTag 的情况下创建 ClassTag
【发布时间】:2013-02-26 17:43:43
【问题描述】:

我想定义一个返回数组的函数,并且我有一个 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 很简单,但我看不到明显的方法。

【问题讨论】:

标签: scala scala-2.10


【解决方案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])吗?

【讨论】:

  • 问题确实是表面上的,我需要一个函数范围内的 TypeTag,但 ClassTag 位于该函数内的调用站点,并且不希望有额外的类型噪音需要 ClassTag 隐含所有沿着调用链向上。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2013-03-18
相关资源
最近更新 更多