从scala的类型获取参数化类型? [英] Get ParameterizedType from scala's Type?
本文介绍了从scala的类型获取参数化类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
import scala.reflect.runtime.universe。 _
pre>
case class X [T:TypeTag](){
val t = typeOf [T] // eg Seq [Int]保存类型参数
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 Type转换为Java ParameterizedType?
import scala.reflect.runtime.universe._
case class X [T:TypeTag](){
val clz:Class [ _] = runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf [T] .typeSymbol.asClass)
}
解决方案
private def parameterizedType(paramType:Type):java.lang.reflect.Type = {$ b $ 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
}
覆盖def getOwnerType:reflect.Type = {
null
}
}
}
}
$ b def makeType [T:TypeTag]:reflect.Type = {
parameterizedType(typeOf [T])
}
似乎可以做到这一点。基本上只需遍历参数化类型并将其转换为java参数化类型对象
Helpfully, scala's universe.typeOf preserves the type parameters of a class.
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's ParameterizedType holds the same un-erased information. How can I convert a scala Type into an Java ParameterizedType?
import scala.reflect.runtime.universe._ case class X[T:TypeTag]() { val clz:Class[_] = runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf[T].typeSymbol.asClass) }
解决方案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]) }
Seems to do the trick. Basically just iterating through the parameterized types and converting it to a java parameterized type object
这篇关于从scala的类型获取参数化类型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文