scala - 在 Scala 2.10 中,如何创建给定 TypeTag 的 ClassTag

标签 scala scala-2.10

我想定义一个返回数组的函数,并且我有一个 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] )?

关于scala - 在 Scala 2.10 中,如何创建给定 TypeTag 的 ClassTag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15095727/

相关文章:

scala - 为无形记录定义类型类

scala - UnresolvedException : Invalid call to dataType on unresolved object when using DataSet constructed from Seq. 空(自 Spark 2.3.0 起)

scala - 在2.10中替代Scala REPL breakIf

scala - 带有 var Enum 成员的 case 类,退出作用域后不保存值

scala - 我可以告诉 scala 如何更喜欢更具体的隐式,而不是给出 "ambiguous implicit"错误吗?

list - 如何从只有索引的 Scala 列表中删除项目?

scala - 如何创建循环流?

java - Scala - 组合 LocalDate 和 LocalTime 时如何正确添加 ZoneOffset?

带列表的 Scala foldLeft

scala - 你如何在 Slick 中使用带有参数的 StaticQuery.update?