我必须使用设计为:
的第三方特征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]
?
答案 0 :(得分:2)
如果在伴随对象中定义隐式defs,则必须求助于基于冲突的类型计算。但是对于"某些特定类型",defs通常不在类的伴随对象中(例如,不在object Option
上)。在这种情况下,您可以利用implicits在给定命名空间内相互隐藏的事实。所以你可以
implicit def superFor[T]: SomeThrowawayType = ???
他们的superFor
不再工作了。由于您更改了返回类型,因此不会发生碰撞或任何事情;它实际上已经消失了。然后,您可以在显式调用其defs的任何优先级别创建自己的转发器。
但是,这确实需要您之后导入你的东西(因此它会影响他们的东西)。如果这看起来过于繁琐,你就不得不进行类型计算。