【发布时间】:2015-04-21 19:18:30
【问题描述】:
我必须使用第三方特征,其设计如下:
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]?
【问题讨论】:
-
旧的ambiguous implicits trick 应该在这里工作。
-
@TravisBrown 太棒了!我应该使用规范的无形
Not[T]吗? -
我不这么认为——存在类型不平等(以这种方式实现),但 IIRC 不是类型类否定。
-
应该是
Sub[T] extends Super[T]?