Как я могу создать тип Option во время выполнения (отражение)? - PullRequest
0 голосов
/ 17 февраля 2019

Используя отражение, я определил тип вещи во время выполнения, 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, у него есть член MaybeThing типа Object [T] или даже Object [Thing].Во время выполнения, скажем, я могу определить, что у конкретного объекта есть T = BigThing, поэтому я хочу передать Option [BigThing], а не Option [T] или Option [Thing] в handler ().Вот почему я пытаюсь создать тип исполнения Option [BigThing].

Я попробовал следующее, но Scala это не понравилось:

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

1 Ответ

0 голосов
/ 17 февраля 2019

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

существует три способа создания Type.

  • с помощью метода typeOf on 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
...