scala - 如何从对象扩展的抽象类中获取类型参数
问题描述
假设我有一个扩展某个抽象类的对象
case class Id[T] private(v: String)
object SomeObj extends SomeAbstractClass[SomeCaseClass, AnotherObj.type, Id[SomeCaseClass]]
是否可以在运行时从 SomeObj 获取以下类型参数?
- SomeCaseClass
- 另一个对象类型
- Id[SomeCaseClass]
解决方案
假设这些导入和定义(对于一个独立的示例):
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]
)
这两种解决方案都受此答案启发。
推荐阅读
- javascript - TypeError:无法调用 null 的方法“createEvent”。(第 38 行,文件“代码”)
- django - 在 Django 中使用模型创建有序列表
- node.js - Firebase Cloud Functions:来自referer 的请求
被阻止。- 没有权限 - node.js - 安装后无法连接到 Express 欢迎页面
- php - 循环时简单的html dom遍历混淆
- node.js - 如何从服务器端发出 API 请求?
- node.js - https 在 Linux 中无法使用 node/express/webpack
- java - Oracle Fusion Middleware 安装意外错误 Nullpointer 异常
- java - 不是在 Eclipse-Java 中创建的日志文件
- algorithm - 在 fortran 中使用蒙特卡罗方法估计 pi