【问题标题】:Can I inspect my scala codebase to find all warnings of type: "Comparing Unrelated types"?我可以检查我的 scala 代码库以查找所有类型的警告:“比较不相关的类型”吗?
【发布时间】:2020-03-03 07:37:37
【问题描述】:

我想检查我的代码库以找到“Fruitless type test”警告和“Comparing Unrelated types”警告 基本上我们的代码库中有一个相当大的错误,如果我们不忽略这个警告,这个错误是可以避免的。 我们现在想检查代码以查找我们的代码库中是否还有其他实例?

【问题讨论】:

    标签: scala scala-compiler


    【解决方案1】:

    我检查了所有记录在案的 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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      假设您使用的是 IntelliJ,请尝试执行 single inspection

      1. Analyse | Run Inspection by Name...
      2. 输入Comparing unrelated types
      3. Inspection scope 设置为Whole project

      考虑避免使用原版的==,而改用===

      import cats.implicits._
      1 == ""   // res5: Boolean = false
      1 === ""  // compiler error
      

      考虑wartremover

      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)
      

      【讨论】:

        【解决方案3】:

        不特定于 == 错误,但将 scalacOptions ++= Seq("-Xfatal-warnings") 添加到您的 build.sbt 会将警告转换为错误并导致编译失败。将某些代码位置标记为“忽略警告”比默认忽略警告更安全。

        您有各种用于代码检查的 sbt 插件,它们在编译时也很有帮助。

        我不建议插入额外的库(如猫): 您希望您的运行时尽可能简单,并且将例如 import cats.implicits._ 添加到您的类中几乎与简单相反。例如,此导入将在运行时愉快地创建数千个各种猫事物的实例,很可能需要几秒钟才能将它们全部实例化,因为它实际上会在运行时检查您的整个代码库。

        【讨论】:

        • 嗯,你总是可以从猫那里导入你需要的东西。
        • 这绝对是正确的(即使事实上并非微不足道)!但是猫只是一个例子,我的观点是有针对这个问题量身定制的解决方案,不会让你的运行时间变得更重。
        猜你喜欢
        • 2020-05-20
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多