【发布时间】:2015-05-29 20:09:20
【问题描述】:
我有一个成员类型的特征,并且想要一个带有包含此类型的签名的宏:
trait Foo {
class Bar[A] { ... }
def baz[A](x: Bar[A]): Bar[A] = macro bazImpl[A]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Bar[A]]) = ...
}
这不起作用,因为bazImpl 必须属于静态(即非成员)object 或宏包。但在这两种情况下,我都没有foo: Foo,所以我可以写foo.Bar[A]。
我能想到的一种解决方法是使用 Foo#Bar[A] 并添加演员表:
trait Foo {
class Bar[A] { ... }
def baz[A](x: Bar[A]): Bar[A] = Foo.baz1(x).asInstanceOf[Bar[A]]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Bar[A]]) = ...
}
object Foo {
def baz1[A](x: Foo#Bar[A]): Foo#Bar[A] = macro bazImpl[A]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Foo#Bar[A]]): c.Expr[Foo#Bar[A]] = ...
}
但我想避免它(既因为它不完全是类型安全的,又因为实际情况更复杂)。有其他选择吗?
【问题讨论】:
-
你能在嵌套类中创建一个嵌套的伴生对象吗?换句话说,让
Bar对象嵌套在包含bazImpl方法的Foo特征中? -
@BenReich 如前所述,宏实现必须在 static 对象中。嵌套在
Foo中的对象不是静态的(至少据我所知)。
标签: scala scala-macros scala-2.11 scala-reflect