Scala 我可以使用“工具箱”中定义的类作为“typeOf[]”的类型参数吗?
我想尝试使用一个带有反射库的动态数据模型,反射库使用Scala 我可以使用“工具箱”中定义的类作为“typeOf[]”的类型参数吗?,scala,reflection,runtime,metaprogramming,toolbox,Scala,Reflection,Runtime,Metaprogramming,Toolbox,我想尝试使用一个带有反射库的动态数据模型,反射库使用typeOf[] 我在2.11中使用Scala反射工具箱定义了一个运行时类: import scala.tools.reflect.ToolBox import scala.reflect.runtime.universe._ import scala.reflect.runtime.{ currentMirror => cm } def cdef() = q"case class C(v: String)" val tb = cm.m
typeOf[]
我在2.11中使用Scala反射工具箱定义了一个运行时类:
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{ currentMirror => cm }
def cdef() = q"case class C(v: String)"
val tb = cm.mkToolBox()
val csym = tb.define(cdef())
def newc(csym: Symbol) = q"""new ${csym}("hi")"""
val obj = tb.eval(newc(csym))
我可以通过ClassSymbol
输入Scala反射来绕过typeOf[]
调用,但这需要修改一个我无法直接控制的库
在入口点为typeOf[]
的库中,是否有任何方法可以将其用作类型参数
我试过了:
我发现从一个值转换为我可以在类型位置使用的东西的唯一方法是使用Java反射来调用伴生类的apply方法,并对结果调用。type
:
val method_apply = obj.getClass.getMethod("apply", "".getClass)
val typeTemplate = method_apply.invoke(obj, "hello")
type MyType = typeTemplate.type
(按照@xeno_by和@travisbrown的命名方案,我可以称之为“弗兰肯斯坦类型”,因为它是由零件制成的,考虑到在错误的时间有生命,不能完全替代原材料,并且考虑到这一切都是在运行时发生的,可能应该用火焚烧。)
在某些情况下,此类型别名用作类型参数。但是在typeOf[MyType]
的情况下,编译器在定义运行时类型之前生成一个TypeTag
,因此typeOf[MyType]
返回一个与运行时类型/类不对应的类型成员(例如TypeTag[package.Example.MyType]
而不是TypeTag[package.C]
)
我应该期望工具箱
生成一个类型标签
,如果是,我该如何使用它
如果我必须在运行时创建一个TypeTag
,那么演示了如何将其附加到用作类型参数的任何对象上
谢谢你的建议
-朱利安你能举个例子说明你想要实现什么吗?您正在调用的方法要求您提供typeOf?与使用Salat类似,但改为使用。看起来,AvroType[T]
使用隐式类型标签来获取T的运行时类信息,所以我假设(可能是天真的)如果我可以做typeOf[MyType]
…我也可以做AvroType[MyType]
。显示错误(没有与消除别名类型参数相对应的类)。如果有用的话,一个粗略的Scalavro分支,通过传入工具箱和类符号来显示解决方法。是的,我认为这样做可以奏效。您需要创建一个伪类型,然后为该类型创建一个伪类型标记,该类型包含要传入的scala.reflect.runtime.type。类型别名在我看来不够虚拟,所以我会选择类似于class Foo{type t;implicit val-tag:TypeTag[t]=createTypeTag(yourTpe).asInstanceOf[TypeTag[t]};val dummy=新的Foo;导入虚拟对象。
。