首页 > 解决方案 > 来自类型参数的 WeakTypeOf

问题描述

我有一个带有函数的简单代码,它获取 weakTypeOf 案例类并返回它的字段,可以预见的是我们得到 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 吗?

标签: scalaimplicitscala-reflect

解决方案


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

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
}

推荐阅读