在 scala 中,是否可以阻止编译器首先搜索 Predef implicit?
In scala, is it possible to discourage the compiler from searching for Predef implicit first?
这个post:
Where does Scala look for implicits?
描述了现代 Scala 编译器使用的隐式搜索优先级和算法。在上面的列表中,直接导入的隐式函数应该比关联类型中的范围具有更高的优先级(例如,在伴随对象中定义)
这条规则大部分时间都有意义,直到直接导入 Predef.scala 开始干扰:
case class A(v: Int)
object A {
implicit class AFns(self: A) {
def +(v2: Int): A = A(self.v + v2)
}
}
val a1 = A(3)
val b = a1 + 4
assert(b == A(7))
上面的例子应该编译成功,但是 Predef 中定义的所有 类 的 + 运算符覆盖主导了场景并导致所有带有 + 运算符的扩展都无用(除非在更严格的范围内明确导入)。这非常烦人,有没有办法禁用 Predef 中的隐式或 'downgrade' 它的优先级?
以上实验已在scala 2.12.12 & 2.13.3中进行
这个post:
Where does Scala look for implicits?
描述了现代 Scala 编译器使用的隐式搜索优先级和算法。在上面的列表中,直接导入的隐式函数应该比关联类型中的范围具有更高的优先级(例如,在伴随对象中定义)
这条规则大部分时间都有意义,直到直接导入 Predef.scala 开始干扰:
case class A(v: Int)
object A {
implicit class AFns(self: A) {
def +(v2: Int): A = A(self.v + v2)
}
}
val a1 = A(3)
val b = a1 + 4
assert(b == A(7))
上面的例子应该编译成功,但是 Predef 中定义的所有 类 的 + 运算符覆盖主导了场景并导致所有带有 + 运算符的扩展都无用(除非在更严格的范围内明确导入)。这非常烦人,有没有办法禁用 Predef 中的隐式或 'downgrade' 它的优先级?
以上实验已在scala 2.12.12 & 2.13.3中进行