初めて準引用符を試して、新しいケース クラスを一般的に生成します。
val universe: scala.reflect.runtime.universe.type = scala.reflect.runtime.universe
import universe._
import scala.reflect.runtime.{currentMirror => m}
import scala.tools.reflect.ToolBox
val toolbox = m.mkToolBox()
trait Father
class A extends Father {
println("I'm A")
val a = 0
}
class B extends Father {
println("I'm B")
val b = 0
}
object Produce {
def A(): A = {
val weakT = weakTypeOf[A]
val genTree = q"""
case class Son() extends $weakT {
println("I'm alive")
}
Son()
"""
val compiledCode = toolbox.eval(genTree)
compiledCode.asInstanceOf[A]
}
def apply[T <: Father](): T = {
val weakT = weakTypeOf[T]
val genTree = q"""
case class Son() extends $weakT {
println("I'm alive")
}
Son()
"""
val compiledCode = toolbox.eval(genTree)
compiledCode.asInstanceOf[T]
}
}
Produce.A()
Produce[A]()
Produce.A() の結果:
私はAです
私は生きている
res0: A = 息子 ()
Produce[A]() の結果:
scala.tools.reflect.ToolBoxError: 未解決のフリー型変数が原因でリフレクション ツールボックスが失敗しました: :32:13 の apply によって定義された T 自由型変数の追跡に問題がある場合は、scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal の scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.verify(ToolBoxFactory.scala:82) で -Xlog-free-types を使用することを検討してください。 .compile(ToolBoxFactory.scala:208) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2.apply(ToolBoxFactory.scala:429) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$$anonfun$compile$2 .apply(ToolBoxFactory.scala:422) at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.liftedTree2$1(ToolBoxFactory.scala:355) at scala.tools.reflect.