我一直在使用
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
方法中,但我不知道如何执行以下任何操作:
Tag[T]
的值。LightTypeTag
类型的值转换回 Tag[T]
。非常感谢任何帮助。
好的。当然,在我发布此内容后,我想我得到了答案,但我想确定它是正确的。我意识到我真的想要一个
Tag[T]
,但我不知道如何获得一个,但后来我意识到我有一个given Tag[T]
可用,所以我做到了
case class Rule[T: Tag](lhs: String, rhs: Repr[T]):
val tag: Tag[T] = summon[Tag[T]]
如果我在缺少隐式
(using rule.tag)
的地方添加 Tag[T]
,事情似乎就可以了。这是处理这个问题的正确方法吗?