Как я могу создать тип 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