从scala的类型获取参数化类型? [英] Get ParameterizedType from scala's Type?

查看:130
本文介绍了从scala的类型获取参数化类型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有趣的是,scala的universe.typeOf保留了类的类型参数。

  import scala.reflect.runtime.universe。 _ 

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆