0

使用反射,我确定了一个事物的运行时类型,t:Type。现在我想创建一个新的 Option[t] 类型。我怎样才能做到这一点?

val t: Type = ...
val optT: Type = ???  // Option of whatever t is

为什么我想要这个:我有一个对 Type 进行操作的处理函数。在编译时我有这样的东西:

trait Thing { name: String }
case class BigThing(name: String) extends Thing

case class Stuff[T <: Thing]( id: Int, maybeThing: Option[T] ) // contrived

def handler( t: Type ): Output = {...}

我可以反映,如果我有一个 Stuff 类型的类,它可能有一个 Object[T] 甚至 Object[Thing] 类型的成员。在运行时,假设我可以确定特定对象具有 T = BigThing,所以我想将 Option[BigThing],而不是 Option[T] 或 Option[Thing] 传递给 handler()。这就是为什么我要尝试创建 Option[BigThing] 的运行时类型。

我确实尝试了以下方法,但 Scala 不喜欢它:

val newType = staticClass(s"Option[${runtimeTypeTAsString}]")
4

1 回答 1

2

根据教程

有三种方法可以实例化 a Type

  • 通过方法typeOfon scala.reflect.api.TypeTags,它被混合到 Universe 中(最简单和最常见的)。
  • 标准类型,例如IntBooleanAnyUnit可通过可用 Universe 访问。
  • 使用工厂方法手动实例化,例如typeRefor polyTypeon scala.reflect.api.Types,(不推荐)。

使用第三种方式,

import scala.reflect.runtime.universe._

class MyClass

val t: Type = typeOf[MyClass] //pckg.App.MyClass

val mirror = runtimeMirror(ClassLoader.getSystemClassLoader)

val optT: Type = mirror.universe.internal.typeRef(
  definitions.PredefModule.typeSignature, 
  definitions.OptionClass, 
  List(t)
) // Option[pckg.App.MyClass]

val optT1 : Type = typeOf[Option[MyClass]]

optT =:= optT1 // true
于 2019-02-17T18:01:39.100 回答