为了说明下面的例子,我创建了一个litte spock测试(但它是关于groovy本身,而不是spock):
void "some spock test"() {
given: String value = null
expect: someMethod(value) == 3
}
int someMethod(String s) {
return 3
}
int someMethod(Map s) {
return 5
}
有两种方法的签名仅因给定参数的类型而异。我认为当我给它一个显式类型为字符串的空值时,将调用string-method。 但这不会发生;测试失败,因为调用了map方法!为什么呢?
我猜groovy会忽略该类型并将所有空值视为相同。似乎有某种类型的优先级:当我使用Object而不是Map作为错误方法的参数类型时,它都是相同的,但是当我例如使用Integer时,测试成功。 但不止于此:如果groovy真的忽略了null的类型,为什么以下可以修复原始测试:
expect: someMethod((String) value) == 3
答案 0 :(得分:1)
如果你读过我已经提到的answer to the question Tim,你会看到我在那里谈论运行时类型。静态类型通常不起作用。我还在那里描述了如何使用距离计算,并且对于null,使用到Object的距离来确定最佳拟合方法。我没有提到的是你可以通过使用强制转换强制方法选择。内部Groovy将使用对象的包装器,它也传输类型。然后使用传输的类型。但是你肯定明白,这意味着每个方法类创建一个额外的对象,这是非常低效的。因此它不是标准。在将来,Groovy可能会更改为包含静态类型信息,但这也需要更改MOP。这很难