11

配列を返す関数を定義したいのですが、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 を生成するのは簡単だと思っていたでしょうが、明確な方法がわかりません。

4

1 に答える 1

8

もっと簡単な解決策を見たいのですが、ここに私が思いついたものがあります:

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)
}

そもそも本当に a を渡す必要があるかどうかを確認する必要がありますTypeTagClassTag( のように) 代わりにa を渡すことはできませんdef fun[X: ClassTag]か?

于 2013-02-26T18:45:04.030 に答える