scala 我该怎么挂一个泉牌?

eivnm1vs  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(47)

我一直在使用izumi.reflect.Tag来保存类型信息,它工作得很好。除了当我在某个时候丢失了类型信息,然后我不知道如何找回它。下面是我想做的:

case class Rule[T: Tag](lhs: String, rhs: Repr[T])

字符串
这太棒了。一个Rule知道它里面的rhs的类型。除了...

val rules: List[Rule[?]] = // some list of rules
rules.foreach { r =>
  process(r)
}

def process[T: Tag](rule: Rule[T]): Unit = // side-effectful processing


现在,我得到了could not find implicit value for izumi.reflect.Tag[T]。好吧,没什么好奇怪的。那个Tag不能被恢复,因为它和List中的所有其他标签混在一起了。但是有没有什么方法可以保存这个标签,以便以后再把它找回来呢?
我试过

case class Rule[T: Tag](lhs: String, rhs: Repr[T]):
   val LightTypeTag = Tag[T].tag


和类似的方法来保持Tag,这样我就可以做一些事情,

process(r, r.tag)

def process[T: Tag](rule: Rule[T], tag: Tag[T]) = ...


或者显式地将Tag[T]传递到process方法中,但我不知道如何执行以下操作:
1.保存Tag[T]类型的值。
1.将LightTypeTag类型的值转换回Tag[T]
1.显式保存和使用其他值的其他组合将进行此类型检查。
任何帮助非常感谢。

mwg9r5ms

mwg9r5ms1#

好的。当然,在我发布这个之后,我想我得到了一个答案,但我想确定它是正确的。我意识到我真的很想要一个Tag[T],我不知道如何得到一个,但后来我意识到我有一个given Tag[T]可用,所以我做到了

case class Rule[T: Tag](lhs: String, rhs: Repr[T]):
  val tag: Tag[T] = summon[Tag[T]]

字符串
如果我在缺少隐式Tag[T]的地方加上(using rule.tag),事情似乎可以工作,这是正确的处理方法吗?

相关问题