2016-07-07 58 views
5

有意思的是,scala的universe.typeOf保留了类的类型参数。从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 :-(

Java的ParameterizedType保持相同的未擦除信息。我怎样才能将scala类型转换为Java参数化类型?

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参数化类型对象