比较匹配器在混合数字类型上失败

时间:2019-06-13 23:01:15

标签: scala scalatest matcher comparison-operators

在香草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]

那会失败吗?

1 个答案:

答案 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关键字进行数组比较。