【问题标题】:Get ParameterizedType from scala's Type?从 scala 的类型中获取 ParameterizedType?
【发布时间】:2016-07-07 22:53:09
【问题描述】:

有用的是,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    :-(

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

【问题讨论】:

    标签: scala generics


    【解决方案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 参数化类型对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      相关资源
      最近更新 更多