Как я могу создать тип Option во время выполнения (отражение)?

Используя отражение, я определил тип вещи во время выполнения, t: Type. Теперь я хочу создать новый тип опции [t]. Как я могу это сделать?

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

Почему я хочу это: у меня есть функция-обработчик, которая работает с типом. Во время компиляции у меня есть что-то вроде этого:

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

1 ответ

Решение

Согласно учебнику

Есть три способа создания Type,

  • через метод typeOf на scala.reflect.api.TypeTags, который смешивается во Вселенной (самый простой и распространенный).
  • Стандартные типы, такие как Int, Boolean, Any, или же Unit доступны через доступную вселенную.
  • Ручная реализация с использованием заводских методов, таких как typeRef или же polyType на 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
Другие вопросы по тегам