我想定义一个返回数组的函数,我有一个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)
Run Code Online (Sandbox Code Playgroud)
或者是否有必要提供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]
Run Code Online (Sandbox Code Playgroud)
我认为从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)
}
Run Code Online (Sandbox Code Playgroud)
你需要确保你真的需要首先通过一个TypeTag.你不能通过一个ClassTag代替(如def fun[X: ClassTag])?
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |