使用 shapeless 在 scala 中获取参数化 class 的名称

Getting name of parameterized class in scala using shapeless

我想获取 class 的名称作为参数传递给使用 shapeless 的函数。我试过这个:

def sayMyName[T](t: T): String = Typeable[T].describe // error: class type required but T found

如果T换成具体类型就没有问题。是否可以使用 shapeless 制作类似这样的作品?

您只需添加 Typeable 类型类作为您类型的上下文绑定 T:

def sayMyName[T: Typeable](t: T): String = Typeable[T].describe

sayMyName("") //String

您也可以显式声明隐式参数:

def sayMyName[T](t: T)(implicit typeable: Typeable[T]): String = Typeable[T].describe

通过添加上下文绑定,您要求编译器等待解析 Typeable
typeclass 直到 sayMyName 用具体类型调用,而不是立即解析它(这是不可能的,因为此时 T 的真实类型还不知道)。