2016-07-07 32 views
5

Helply, scala's universe.typeOf conserva i parametri di tipo di una classe.Ottieni ParameterizedType dal tipo di scala?

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 :-(

Il parametro ParameterizedType di Java contiene le stesse informazioni non cancellate. Come posso convertire un tipo scala in un ParameterizedType Java?

import scala.reflect.runtime.universe._ 

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

risposta

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

sembra fare il trucco. Fondamentalmente solo iterando attraverso i tipi parametrizzati e convertendolo in un oggetto di tipo parametrico java