如何隐藏我的隐式方法或禁用特定密封系列的“LabelledGeneric”?

时间:2015-04-21 19:18:31

标签: scala shapeless

我必须使用设计为:

的第三方特征
trait Super[T]
trait Sub[T] extends Super[T]

我已经定义了以下方法来为任意密封系列提供实例:

implicit def subFor[T, Repr](
  implicit
  gen: LabelledGeneric.Aux[T, Repr],
  sg: Lazy[JsonFormat[Repr]]
): Sub[T] = ???

但是代码中的其他地方,有人已经定义了

implicit def superFor[T]: Super[T] = ???

对于某些特定类型,例如Option和其他一些人。

实际上,我想使用现有的实现而不是 使用我的subFor通用实现。但是,因为我的 方法返回Sub[T]并返回现有实现 Super[T]我看不出任何方法来定义我的实现 这种方式被认为是较低的优先级。

如何阻止我的subFor被特定类型调用? 有没有办法禁用LabelledGeneric具体 类型,或一些优先减少机制,将阻止 如果编译器已经看到了subFor,它就会一直在寻找 Super[T]

1 个答案:

答案 0 :(得分:2)

如果在伴随对象中定义隐式defs,则必须求助于基于冲突的类型计算。但是对于"某些特定类型",defs通常不在类的伴随对象中(例如,不在object Option上)。在这种情况下,您可以利用implicits在给定命名空间内相互隐藏的事实。所以你可以

implicit def superFor[T]: SomeThrowawayType = ???

他们的superFor不再工作了。由于您更改了返回类型,因此不会发生碰撞或任何事情;它实际上已经消失了。然后,您可以在显式调用其defs的任何优先级别创建自己的转发器。

但是,这确实需要您之后导入你的东西(因此它会影响他们的东西)。如果这看起来过于繁琐,你就不得不进行类型计算。