是否可以使用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))
}
ClassTag
s(以及TypeTag
s和WeakTypeTag
s)用于将一些编译时信息持久化到运行时。你想做一些反向的事情。您希望拥有运行时信息(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,
)