границы типа отражения scala - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь построить полный набор путей из класса 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-интерфейс отражения, чтобы рассматривать верхний как его время выполнения / более конкретный тип, а не как его верхний предел?

...