groovy会忽略方法签名中的空值类型吗?

groovy会忽略方法签名中的空值类型吗?,groovy,types,casting,Groovy,Types,Casting,为了说明以下示例,我创建了一个litte spock测试(但它是关于groovy本身的,而不是spock): 有两种方法的签名仅因给定参数的类型而不同。我认为当我给它一个显式类型化为字符串的空值时,将调用string方法。 但事实并非如此;测试失败,因为调用了map方法!为什么? 我猜groovy会忽略该类型,并将所有空值视为相同的值。类型似乎有某种优先级:当我使用Object而不是Map作为错误方法的参数类型时,这一切都是一样的,但是当我使用Integer时,测试成功了。 但是再一次:如果gr

为了说明以下示例,我创建了一个litte spock测试(但它是关于groovy本身的,而不是spock):

有两种方法的签名仅因给定参数的类型而不同。我认为当我给它一个显式类型化为字符串的空值时,将调用string方法。 但事实并非如此;测试失败,因为调用了map方法!为什么?

我猜groovy会忽略该类型,并将所有空值视为相同的值。类型似乎有某种优先级:当我使用Object而不是Map作为错误方法的参数类型时,这一切都是一样的,但是当我使用Integer时,测试成功了。 但是再一次:如果groovy真的忽略了null的类型,为什么下面的代码可以修复原始测试:

expect: someMethod((String) value) == 3

如果您阅读我已经提到的Tim,您将看到我在那里谈到了运行时类型。静态类型在这方面通常不起作用。我还介绍了如何使用距离计算,对于null,使用到对象的距离来确定最佳拟合方法。我没有提到的是,您可以通过使用强制转换强制选择方法。Groovy将在内部为对象使用包装器,该包装器也传输类型。然后使用transported类型。但您肯定知道,这意味着每个方法类要额外创建一个对象,这是非常低效的。因此,这不是标准。在将来,Groovy可能会更改为包含该静态类型信息,但这也需要更改MOP。这很难

@tim_-yates:thx。我知道这一点,但是null没有类型,所以groovy不知道调用哪个方法的原因很清楚。我相信同样的规则也适用,因为除非您使用CompileStaticeg,否则类型将被丢弃,请尝试:
String a=null;println a.getClass()
您应该获得
类org.codehaus.groovy.runtime.NullObject
,而不是
java.lang.String
expect: someMethod((String) value) == 3