gpt4 book ai didi

scala - 从 Scala 的类型获取 ParameterizedType?

转载 作者:行者123 更新时间:2023-12-04 21:35:54 25 4
gpt4 key购买 nike

有用的是,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)
}

最佳答案

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

关于scala - 从 Scala 的类型获取 ParameterizedType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38256500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com