小编ste*_*der的帖子

为什么此类型相等性检查在SBT中失败,但在我的IDE中成功?

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

tag == typeTag[Unit]
Run Code Online (Sandbox Code Playgroud)

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

tag.tpe =:= typeOf[Unit]
Run Code Online (Sandbox Code Playgroud)

我的问题不是如何解决问题(因为已经存在),而是为什么有缺陷的检查在通过我的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
Run Code Online (Sandbox Code Playgroud)

reflection types scala equality sbt

5
推荐指数
0
解决办法
93
查看次数

标签 统计

equality ×1

reflection ×1

sbt ×1

scala ×1

types ×1