scala通过类获取泛型类型



是否可以使用class传递泛型参数:

def m(clazz: Class[_]): Unit = {
m2[] //here I want to exact type (that I should have because I have Class)
}
def m2[C: ClassTag]() : List[C] = {
println("hi")
List.empty
}

任何想法?

如果你想调用一个需要ClassTag的方法,而你只有一个Class。您可以从Class创建ClassTag,如下所示:

def m(clazz: Class[_]): Unit = {
m2()(ClassTag(clazz))
}

ClassTags(以及TypeTags和WeakTypeTags)用于将一些编译时信息持久化到运行时。你想做一些反向的事情。您希望拥有运行时信息(clazz: Class[_]),以便在编译时执行某些操作(指定m2的类型参数C)。所以ClassTag是不相关的。

你可以在运行时调用编译器

import scala.tools.reflect.ToolBox
import scala.reflect.runtime.currentMirror
object App {
val tb = currentMirror.mkToolBox()
def m(clazz: Class[_]): Unit = {
tb.eval(tb.parse(s"import App._; m2[${clazz.getName}]"))
}
def m2[C]() : List[C] = {
println("hi")
List.empty
}
def main(args: Array[String]): Unit = {
m(classOf[String]) //hi
}
}
libraryDependencies ++= Seq(
scalaOrganization.value % "scala-reflect" % scalaVersion.value,
scalaOrganization.value % "scala-compiler" % scalaVersion.value,
)

相关内容

  • 没有找到相关文章

最新更新