При условии, что эти импорта и определения (для отдельного примера):
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]
)
Оба решения вдохновлены этот ответ здесь .