Как получить параметры типа из абстрактного класса, который расширяется объектом - PullRequest
1 голос
/ 06 июня 2019

Предположим, у меня есть объект, расширяющий некоторый абстрактный класс

case class Id[T] private(v: String)

object SomeObj extends SomeAbstractClass[SomeCaseClass, AnotherObj.type, Id[SomeCaseClass]]

Можно ли получить следующие параметры типа от SomeObj во время выполнения?

  • SomeCaseClass
  • AnotherObj.type
  • Id [SomeCaseClass]

1 Ответ

3 голосов
/ 06 июня 2019

При условии, что эти импорта и определения (для отдельного примера):

import scala.reflect.runtime.universe._
trait Foo[A, B, C]
object Bar extends Foo[Int, String, Option[Short]]

Явно ссылаются на Bar.type:

internal
  .thisType(typeOf[Bar.type].typeSymbol.asClass)
  .baseType(typeOf[Foo[_,_,_]].typeSymbol.asClass)
  .typeArgs

Без ссылки на Bar.type:

val a: Any = Bar // pretend that it's some instance, not necessarily `Bar`
val m = runtimeMirror(getClass.getClassLoader)
internal
  .thisType(m.reflect(a).symbol.asClass)
  .baseType(typeOf[Foo[_,_,_]].typeSymbol.asClass)
  .typeArgs

Оба дают:

List(
  scala.Int,
  String,
  scala.Option[scala.Short]
)

Оба решения вдохновлены этот ответ здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...