我想获得一个类型的名称,作为一个字符串,没有运行时反射。
使用宏,并使用类型的实例,我可以这样做:
def typeNameFromInstance[A](instance: A): String =
macro typeNameFromInstanceImplementation[A]
def typeNameFromInstanceImplementation[A](
c: Context)(
instance: c.Expr[A]): c.Expr[String] = {
import c.universe._
val name = instance.actualType.toString
c.Expr[String](Literal(Constant(name)))
}
如果没有该类型的实例,我该如何做到这一点?我想要一个函数签名,如:
def typeName[A]: String
我不能使用 ClassTags,因为它们不提供完整的类型名称,只提供已擦除的类型。由于线程安全问题,我显然也不能使用 TypeTags 。
编辑:看起来这是不可能的(例如嵌套函数调用)。下面接受的答案在评论中说明了这一点。