2013-02-26 1 views
11

Arrayを返す関数を定義したいと思います。タイプタグがあります。必要なClassTagを生成することはできますか?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を生成することが簡単で考えているだろうが、私には明白な方法を参照してくださいません。

+0

[ClassTagフォームTypeTagを取得する方法、またはその両方を同時に行う方法は?](http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both-同じ時刻に) – Suma

答えて

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

あなたは本当に最初の場所でTypeTagを渡す必要があり、そのかかわらず、あなたが確認しますよ。代わりにClassTagを渡すことはできません(def fun[X: ClassTag]のように)?

+0

問題は本当に美容です、私は関数のスコープ内でTypeTagが必要ですが、その関数内のコールサイトでClassTagが必要で、ClassTagを暗黙的に必要とする余分なタイプのノイズはありませんコールチェーンを起動します。 –

関連する問題