Я пытаюсь построить полный набор путей из класса case, используя API отражения Scala.Один из параметров, передаваемых конструктору, имеет признак в качестве верхней границы типа (все экземпляры признака являются классами case).Во время выполнения я смог получить доступ к этому параметру только как к экземпляру признака, а не как к базовому классу дел.Вот пример:
trait UpperBound {
def value: String
}
case class UpperBoundedImpl(value: String, other: String) extends UpperBound
case class Bounded[Upper <: UpperBound](id: String, upper: Upper)
def getPaths[T](tt: TypeTag[T]): List[String]
val paths = getPaths(typeTag[Bounded[UpperBoundImpl]]).....
The get paths function keeps track of the current path and recursively calls
the function getTypeConstuctors which is where the problem lies.
def getTypeConstructors(tpe: Type): List[Symbol] =
tpe.decls.collect { case meth: MethodSymbol if meth.isCaseAccessor => meth
}.toList
В этом случае я ожидаю, что getPaths вернет: ["id", "upper.value", "upper.other"].Мне удалось взломать его, чтобы он возвращал ["id", "upper.value"], получая символы isStable сверху, но это не очень хорошо, потому что: a) я пропускаю поля b) это решение не будет обобщать (Я не думаю, что он справился бы, если бы вложенный верхний элемент сам содержал вложенные объекты).
Похоже, проблема в том, что API отражения Scala обрабатывает верхнюю часть как верхнюю, даже если это typeTag of Bounded [UpperBoundImpl].Кто-нибудь знает, как я могу получить API-интерфейс отражения, чтобы рассматривать верхний как его время выполнения / более конкретный тип, а не как его верхний предел?