在我的 scala 代码中,我希望能够实例化一个新类。例如,假设我有以下代码:
class Foo { def foo=10 }
trait Bar { val bar=20 }
理想情况下,我希望能够做类似的事情:
def newInstance[A <: Foo] = { new A with Bar }
newInstance[Foo]
但是,这当然行不通。我尝试使用反射来实例化一个类,但似乎我只能实例化一个新类(而不能与特征混合)。我认为使用宏可以完成这项工作,但我什至不知道从哪里开始。
我想做的就像下面的 Ruby 代码:
class SomeClass
def create
self.class.new
end
end
class Other < SomeClass
end
Other.new.create # <- this returns a new Other instance
是否可以?
用宏:
import scala.language.experimental.macros
import scala.reflect.macros.Context
object MacroExample {
def newInstance[A <: Foo]: A with Bar = macro newInstance_impl[A]
def newInstance_impl[A <: Foo](c: Context)(implicit A: c.WeakTypeTag[A]) = {
import c.universe._
c.Expr[A with Bar](q"new $A with Bar")
}
}
这将按预期工作,并且如果您尝试实例化没有无参数构造函数的类,则会在编译时失败。
我用过准引号 http://docs.scala-lang.org/overviews/macros/quasiquotes.html为了清楚起见,您可以在这里手动构建树,但需要做更多的工作。不过,现在 quasiquotes 可作为 Scala 2.10 的插件使用,但实际上并没有什么充分的理由。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)