首页 > 解决方案 > 为什么这种类型相等检查在 SBT 中失败但在我的 IDE 中成功?

问题描述

我在编写单元测试时遇到了一个有趣的问题,当我通过我的 IDE (IntelliJ Idea) 运行测试时,一段特定的类型检查 Scala 代码成功,而当我通过 SBT 运行它们时失败sbt test。有问题的代码就是这一行:

tag == typeTag[Unit]

这里的标签是TypeTag[A]. 因此,检查是通过反射确定参数类型是否为 Unit,仅此而已。我知道相等性检查有缺陷,我应该使用 Scala 的反射 API 运算符,我已经重写了它,现在它通过我的 IDE 和 SBT 通过测试:

tag.tpe =:= typeOf[Unit]

我的问题不是如何解决我的问题(因为我已经有),而是为什么有缺陷的检查在通过我的 IDE 运行时总是会成功,但在通过 SBT 运行时总是失败,这两个操作之间有什么不同会导致这种差异?

(一些版本信息:我在我的代码中使用 JRE 11.0.2、Scala 2.12 和 SBT 1.2.8。编辑:如下所述,它也发生在 Java 8 上

编辑:我的编译器设置,按照要求。原谅审查,我宁愿小心公司的细节。 在此处输入图像描述

还有我在 build.sbt 中使用的 scalacOptions、编译器插件和测试标志:

val scalacOpts = Seq(
  "-Ywarn-unused:implicits",
  "-Ywarn-unused:imports",
  "-Ywarn-unused:locals",
  "-Ywarn-unused:params",
  "-Ywarn-unused:patvars",
  "-Ywarn-unused:privates",
  "-Ypartial-unification",
  "-deprecation",
  "-encoding", "UTF-8",
  "-feature",
  "-language:existentials",
  "-language:higherKinds",
  "-language:implicitConversions",
  "-unchecked",
  "-Xlint",
  "-Yno-adapted-args",
  "-Ywarn-dead-code",
  "-Ywarn-numeric-widen",
  "-Ywarn-value-discard",
  "-Xfuture"
)

addCompilerPlugin("org.spire-math" %% "kind-projector"     % "0.9.9")
addCompilerPlugin("com.olegpy"     %% "better-monadic-for" % "0.3.0")

testFrameworks += new TestFramework("org.scalameter.ScalaMeterFramework")

logBuffered := false

parallelExecution in Test := false

标签: scalareflectiontypessbtequality

解决方案


推荐阅读