目前,reifier 不知道如何 reify 引用在被 reified 的块中定义的东西的类型。因此错误。
但这与您的示例有什么关系?这是它的工作原理。
为了具体化您的代码块,编译器使用def apply[T: AbsTypeTag](mirror: MirrorOf[self.type], treec: TreeCreator): Expr[T]
(2.10.0-RC1中的更新AbsTypeTag
已重命名为WeakTypeTag
)来创建一个具体化表达式的 Expr 类型的对象。然而,在 Expr 的合同中隐含的是,它还捕获了 reifee 的类型,这导致了问题。
因此,您需要一种解决方法。最简单的方法是将O
代码段的最后一行转换为可具体化的内容,例如 write O.asInstanceOf[Object]
。然后,您可以手动从结果中剥离asInstanceOf
部分。
scala> reify { object O; O }
<console>:26: error: implementation restriction: cannot reify type Object{def <init>(): O.type} (ClassInfoType)
reify { object O; O }
^
scala> reify { object O; O.asInstanceOf[Object] }
res1 @ 2d059fd6: reflect.runtime.universe.Expr[Object] =
Expr[java.lang.Object]({
object O extends AnyRef {
def <init>() = {
super.<init>();
()
}
};
O.asInstanceOf[Object]
})