我可以使用`ToolBox`中定义的类作为`typeOf []`的类型参数吗?

时间:2014-09-01 07:45:30

标签: scala reflection runtime metaprogramming toolbox

我想尝试使用带有typeOf[]反射库的动态数据模型。

我在运行时使用2.11中的Scala反射ToolBox定义了一个类:

import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{ currentMirror => cm }

def cdef() = q"case class C(v: String)"
val tb = cm.mkToolBox()
val csym = tb.define(cdef())
def newc(csym: Symbol) = q"""new ${csym}("hi")"""
val obj = tb.eval(newc(csym))

我可以通过typeOf[]输入Scala反射来绕过ClassSymbol调用,但这需要修改我无法立即控制的库。

有没有什么方法可以将它用作入口点为typeOf[]的库中的类型参数?

我试过了:

我发现从值到我可以在类型位置使用的东西的唯一方法是使用Java反射来调用伴侣类'apply方法并在结果上调用.type

val method_apply = obj.getClass.getMethod("apply", "".getClass)
val typeTemplate = method_apply.invoke(obj, "hello")
type MyType = typeTemplate.type

(保持@xeno_by和@travisbrown的menagerie of odd types的命名方案,我可以称之为“弗兰肯斯坦的类型”,因为它是由部分组成的,在错误的时间生命,不是替代品对于原始的,并且考虑到这一切都是在运行时发生的,应该用火烧掉。)

在某些情况下,此类型别名作为类型参数起作用。但是在typeOf[MyType]的情况下,编译器在定义运行时类型之前生成TypeTag,因此typeOf[MyType]返回与运行时类型/类不对应的类型成员(例如TypeTag[package.Example.MyType]而不是TypeTag[package.C]

我应该期望ToolBox生成TypeTag,如果是,我该如何使用它?

如果我必须在运行时创建TypeTagthis question会告诉我如何,但是如何将它附加到我用作类型参数的任何内容?

感谢任何想法,

-Julian

0 个答案:

没有答案