2016-07-07 11 views
5

スケーラのuniverse.typeOfは、クラスの型パラメータを保持するのに役立ちます。スカラーのタイプからParameterizedTypeを取得しますか?

import scala.reflect.runtime.universe._ 

case class X[T:TypeTag]() { 
    val t = typeOf[T] // e.g. Seq[Int] Holds type parameters 
    val clz:Class[_] = runtimeMirror(this.getClass.getClassLoader).runtimeClass(t.typeSymbol.asClass) 
} 

X[Seq[Int]]().t // Seq[Int] 
X[Seq[Int]]().clz // Seq :-(

Javaのは、ParameterizedTypeは同じ未消去情報を保持しています。スカラー型をJava ParameterizedTypeに変換するにはどうすればよいですか?

import scala.reflect.runtime.universe._ 

case class X[T:TypeTag]() { 
    val clz:Class[_] = runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf[T].typeSymbol.asClass) 
} 

答えて

1
private def parameterizedType(paramType: Type): java.lang.reflect.Type = { 
    val typeConstructor = currentMirror.runtimeClass(paramType) 

    val innerTypes = paramType.typeArgs.map(parameterizedType).toArray 

    if (innerTypes.isEmpty) { 
     typeConstructor 
    } else { 
     new ParameterizedType { 
     override def getRawType: reflect.Type = { 
      typeConstructor 
     } 

     override def getActualTypeArguments: Array[reflect.Type] = { 
      innerTypes 
     } 

     override def getOwnerType: reflect.Type = { 
      null 
     } 
     } 
    } 
    } 

    def makeType[T : TypeTag]: reflect.Type = { 
     parameterizedType(typeOf[T]) 
    } 

トリックを行うようです。基本的には、パラメータ化された型を反復し、それをJavaのパラメータ化された型オブジェクトに変換します。

関連する問題