提问人:steamedcoder 提问时间:6/10/2019 最后编辑:steamedcoder 更新时间:3/19/2022 访问量:315
为什么此类型相等性检查在 SBT 中失败,但在我的 IDE 中成功?
Why does this type equality check fail in SBT but succeed in my IDE?
问:
我在编写单元测试时遇到了一个有趣的问题,当我通过 IDE (IntelliJ Idea) 运行测试时,特定类型检查 Scala 代码成功,而当我通过 SBT 运行它们时失败。有问题的代码就是这一行:sbt test
tag == typeTag[Unit]
这里的标签是 .因此,检查是通过反射确定参数类型是否为单位,仅此而已。我知道相等性检查是有缺陷的,我应该使用 Scala 的反射 API 运算符,我已经这样重写了它,它现在通过我的 IDE 和 SBT 通过了测试:TypeTag[A]
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
答: 暂无答案
评论
def foo[A](a: A)(implicit tag: TypeTag[A]): Boolean = tag == typeTag[Unit]
def foo[A](a: A)(implicit tag: TypeTag[A]): Boolean = tag.tpe =:= typeOf[Unit]
test("foo(())") { assert(foo(())) }
sbt test
sbt clean test
Run | Edit Configurations...
Use sbt shell
Use UI with sbt
sbt clean test