在 Scala 中,是否可以阻止编译器首先搜索 Predef 隐式?

tri*_*oid 1 scala implicit scala-compiler

这个帖子:

Scala 在哪里寻找隐式?

描述了现代 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))
Run Code Online (Sandbox Code Playgroud)

上面的示例应该可以成功编译,但是 Predef 中定义的所有类的 + 运算符覆盖主导了场景,并导致所有带有 + 运算符的扩展无用(除非在更严格的范围内明确导入)。这很烦人,有没有办法在 Predef 中禁用隐式或“降级”其优先级?

以上实验已在scala 2.12.12 & 2.13.3中进行

use*_*ser 6

A._显式导入有效,但您也可以-Yimports通过将其添加到 build.sbt 来省略scala.Predef._导入:

scalacOptions ++= Seq("-Yimports", "java.lang", "scala")
Run Code Online (Sandbox Code Playgroud)

之后,您可以导入Predefany2stringadd类之外的所有内容:

import Predef.{any2stringadd => _, _}
Run Code Online (Sandbox Code Playgroud)

这是一个斯卡斯蒂。