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

问题描述

此帖子:

Where does Scala look for implicits?

描述了现代scala编译器使用的隐式搜索优先级和算法。在上面的列表中,直接导入的隐式函数应该比关联类型(例如,在伴随对象中定义)的作用域具有更高的优先级

在大多数情况下,直到直接导入的Predef.scala开始干扰为止,该规则才有意义:


        abc
abc     1.0
abcd    0.0
abec    0.0
ab      0.0
abcde   0.0
qwe     0.0

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

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

解决方法

显式导入A._ works,但是您也可以使用-Yimports,方法是将其添加到build.sbt中,以省去scala.Predef._导入:

scalacOptions ++= Seq("-Yimports","java.lang","scala")

之后,您可以从Predef类中的any2stringadd类中导入所有内容:

import Predef.{any2stringadd => _,_}

Here's是Scastie。