首页 > 解决方案 > 如何从对象扩展的抽象类中获取类型参数

问题描述

假设我有一个扩展某个抽象类的对象

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

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

是否可以在运行时从 SomeObj 获取以下类型参数?

标签: scalareflection

解决方案


假设这些导入和定义(对于一个独立的示例):

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]
)

这两种解决方案都受此答案启发。


推荐阅读