在香草Scala中,以下声明通过了
assert(1D > 0F)
assert(1F > 0)
assert(1L > 0)
assert(1 > 0.toShort)
assert(1.toShort > 0.toChar)
但是ScalaTest fail
中的相似匹配器1D shouldBe > (0F)
1F shouldBe > (0)
1L shouldBe > (0)
1 shouldBe > (0.toShort)
1.toShort shouldBe > (0.toChar)
一种解决方法是使双方具有相同的类型,例如
1D shouldBe > (0D)
为什么它在Scala中有效,但在Scalatest中无效,或者>
的签名是什么
def >[T : Ordering] (right: T): ResultOfGreaterThanComparison[T]
那会失败吗?
答案 0 :(得分:2)
Vanilla Scala的工作原理是自动进行类型转换,即0F
被强制转换为0D
,这在许多语言中都是常见的做法。
一个更有趣的问题是为什么shouldBe
不起作用。消除隐含产量的糖分
new AnyShouldWrapper[Double](leftSideValue = 1D,
pos = ???,
prettifier = ???)
.shouldBe(new ResultOfGreaterThanComparison[Double](right = 0D))
new AnyShouldWrapper[Double](leftSideValue = 1D,
pos = ???,
prettifier = ???)
.shouldBe(new ResultOfGreaterThanComparison[Float](right = 0F))
导致shouldBe
的实现重载。前一种情况是here,后一种情况是here。
查看源代码后,看来1D shouldBe > (0F)
真正编译的唯一原因是支持使用shouldBe
关键字进行数组比较。