Groovy将通过选择具有字母顺序优先的参数类型的方法来解决模糊方法调用。在下面的示例中,如果Groovy调用MyClass.printIt(null),则将调用带有“A”类型参数的方法。
如果重构此代码以将A类重命名为C类,您将发现使用null myVariable的调用将解析为采用类型为“B”的参数的方法,即底层的。
class MyTest {
public static void main(String[] args) {
B myVariable = new B()
new MyClass().printIt(myVariable)
myVariable = null
new MyClass().printIt(myVariable)
}
}
class A {}
class B {}
class MyClass {
void printIt(A variable) {
println "TOP method called"
}
void printIt(B variable) {
println "BOTTOM method called"
}
}
上面列出的代码产生以下输出
BOTTOM方法叫
名为 的TOP方法,它使用B类变量调用top方法
一旦A类重命名为C类,输出将变为
BOTTOM方法叫
BOTTOM方法叫
尝试尽可能多的排列,当传入的变量为null时,即使为另一个类键入变量,也会调用采用字母名称最小的类的方法。
groovy --version Groovy版本:2.0.5 JVM:1.6.0_33供应商:Sun Microsystems Inc.操作系统:Windows 7
我的问题是为什么Groovy会这样做,这是设计还是错误,这种行为记录在哪里?
戴夫
答案 0 :(得分:0)
无法在groovy 2.1.6上重现这一点。无法在groovy 2.0.5上重现这一点。 在两个用例中,输出为:
BOTTOM method called
TOP method called
当A重命名为C输出时
BOTTOM method called
TOP method called
Gentoo Linux,JDK 1.7.0_25,