Scala WeakTypeOf from类型参数

Scala WeakTypeOf from类型参数,scala,implicit,scala-reflect,Scala,Implicit,Scala Reflect,我有一个简单的函数代码,它获取weakTypeOf case类并返回它的字段,可以预见我们将得到2个项目列表 def getMembers[T: WeakTypeTag] = weakTypeOf[T].members.filterNot(_.isMethod).toList final case class Person(name: String, age: Int) extends Models val fields = getMembers[Person] println(fie

我有一个简单的函数代码,它获取weakTypeOf case类并返回它的字段,可以预见我们将得到2个项目列表

def getMembers[T: WeakTypeTag] = 
  weakTypeOf[T].members.filterNot(_.isMethod).toList

final case class Person(name: String, age: Int) extends Models

val fields = getMembers[Person]
println(fields.length) // 2
它很好用

但如果我想从创建子对象类时传递Person作为类型参数的trait中获取成员,该怎么办?WeakTypeTag在构建期间无法传递给trait

trait ModelManager[CCT] {
  def getMembers: List[String] = ???
}

case object PersonManager extends ModelManager[Person] 

val fields = PersonManager.getMembers
println(fields.length)

有没有办法从CCT参数中获取weakTypeOf?

尝试将隐式参数添加到方法中

trait ModelManager[CCT] {
  def getMembers(implicit weakTypeTag: WeakTypeTag[CCT]): List[Symbol] =
    weakTypeTag.tpe.members.filterNot(_.isMethod).toList
}
或者将特征作为一个抽象类

abstract class ModelManager[CCT: WeakTypeTag] {
  def getMembers: List[Symbol] = weakTypeOf[CCT].members.filterNot(_.isMethod).toList
}

尝试向方法中添加隐式参数

trait ModelManager[CCT] {
  def getMembers(implicit weakTypeTag: WeakTypeTag[CCT]): List[Symbol] =
    weakTypeTag.tpe.members.filterNot(_.isMethod).toList
}
或者将特征作为一个抽象类

abstract class ModelManager[CCT: WeakTypeTag] {
  def getMembers: List[Symbol] = weakTypeOf[CCT].members.filterNot(_.isMethod).toList
}