有用的是,scala的universe.typeOf保留了类的类型参数.
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 :-(
Run Code Online (Sandbox Code Playgroud)
Java的ParameterizedType保存相同的未擦除信息.如何将scala类型转换为Java ParameterizedType?
import scala.reflect.runtime.universe._
case class X[T:TypeTag]() {
val clz:Class[_] = runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf[T].typeSymbol.asClass)
}
Run Code Online (Sandbox Code Playgroud)
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])
}
Run Code Online (Sandbox Code Playgroud)
似乎可以做到这一点。基本上只是迭代参数化类型并将其转换为 java 参数化类型对象