【发布时间】:2020-03-03 07:37:37
【问题描述】:
我想检查我的代码库以找到“Fruitless type test”警告和“Comparing Unrelated types”警告 基本上我们的代码库中有一个相当大的错误,如果我们不忽略这个警告,这个错误是可以避免的。 我们现在想检查代码以查找我们的代码库中是否还有其他实例?
【问题讨论】:
标签: scala scala-compiler
我想检查我的代码库以找到“Fruitless type test”警告和“Comparing Unrelated types”警告 基本上我们的代码库中有一个相当大的错误,如果我们不忽略这个警告,这个错误是可以避免的。 我们现在想检查代码以查找我们的代码库中是否还有其他实例?
【问题讨论】:
标签: scala scala-compiler
我检查了所有记录在案的 Scala 编译器选项,但没有发现任何与 IntelliJ Idea 类似的东西(我想你正在使用这个带有 Scala 插件的 IDE)你发布的检查警告。我猜这是因为 == 操作,然后将其脱糖到 equals 方法调用从编译的角度来看很好:boolean equals(Obejct obj) - 正如您从这个方法签名中看到的那样,它可以传递任何对象类型,因此编译器并没有抱怨这一点。
您可以在此处找到所有 Scala 编译器选项的列表: https://docs.scala-lang.org/overviews/compiler-options/index.html
在这种情况下你可以做什么
短期观点:使用Ctr+Alt+Shift+I 组合和类型检查名称对所有项目运行检查 - 例如Comparing Unrelated types(更多详细信息请参阅:https://www.jetbrains.com/help/idea/running-inspections.html)
从长远来看:使用来自cats 库的Eq 类型类来解决此问题:https://typelevel.org/cats/typeclasses/eq.html
希望这会有所帮助!
【讨论】:
假设您使用的是 IntelliJ,请尝试执行 single inspection
Analyse | Run Inspection by Name...Comparing unrelated types Inspection scope 设置为Whole project
考虑避免使用原版的==,而改用===
import cats.implicits._
1 == "" // res5: Boolean = false
1 === "" // compiler error
addSbtPlugin("org.wartremover" % "sbt-wartremover" % "2.4.5")
wartremoverErrors ++= Warts.all
它给出了类似的东西
[wartremover:Equals] == is disabled - use === or equivalent instead
[error] val x = Some("") == Some(3)
【讨论】:
不特定于 == 错误,但将 scalacOptions ++= Seq("-Xfatal-warnings") 添加到您的 build.sbt 会将警告转换为错误并导致编译失败。将某些代码位置标记为“忽略警告”比默认忽略警告更安全。
您有各种用于代码检查的 sbt 插件,它们在编译时也很有帮助。
我不建议插入额外的库(如猫):
您希望您的运行时尽可能简单,并且将例如 import cats.implicits._ 添加到您的类中几乎与简单相反。例如,此导入将在运行时愉快地创建数千个各种猫事物的实例,很可能需要几秒钟才能将它们全部实例化,因为它实际上会在运行时检查您的整个代码库。
【讨论】: