1

I have a simple code with function which gets weakTypeOf case class and returns its fields, predictably we get 2 items list

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

It works fine

But what if i want to get members from trait where i passed Person as type parameter when create a child object class? (WeakTypeTag i can not pass to trait during construction)

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

case object PersonManager extends ModelManager[Person] 

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

Is there any way to get weakTypeOf from CCT parameter?

Dmytro Mitin
  • 48,194
  • 3
  • 28
  • 66
Dmitry Reutov
  • 2,995
  • 1
  • 5
  • 20

1 Answers1

5

Try to add implicit parameter to the method

trait ModelManager[CCT] {
  def getMembers(implicit weakTypeTag: WeakTypeTag[CCT]): List[Symbol] =
    weakTypeTag.tpe.members.filterNot(_.isMethod).toList
}

or make the trait an abstract class

abstract class ModelManager[CCT: WeakTypeTag] {
  def getMembers: List[Symbol] = weakTypeOf[CCT].members.filterNot(_.isMethod).toList
}
Dmytro Mitin
  • 48,194
  • 3
  • 28
  • 66