我希望能够使用基于某些类名的宏创建类型良好的实例。例如,我希望能够Long
像这样创建一个实例:
def fromName[T](typeName: String) = macro FromNameMacro.impl[T]
// will typecheck ok
fromName("scala.Long") ==== 0L
// will not typecheck ok
fromName("scala.Long") ==== ""
实现将类似于:
import scala.reflect.macros.Context
object FromNameMacro {
def impl[T: c.WeakTypeTag](c : Context)(klassName: c.Expr[String]): c.Expr[T] = {
import c.{universe => u}; import u._
val name = klassName.tree match { case Literal(Constant(n)) => n.toString }
// of course this doesn't work...
reify(this.getClass.getClassLoader.loadClass(name).newInstance.asInstanceOf[T])
}
}
我的问题是:
鉴于类型取决于参数,我需要做什么才能让宏返回正确类型的对象?
甚至可以使用 Scala 2.10 吗?