package bug
import groovy.transform.CompileStatic
@CompileStatic
class BugCheck
{
static void main(String[] args)
{
new BugCheck()
}
BugCheck()
{
new Child().method(1f) // causes the problem
}
class Parent
{
void method(float f, boolean b=true)
{
println("Parent")
}
}
class Child extends Parent
{
@Override
void method(float f)
{
println("Child")
}
}
}
用Groovy 2.3.4编译这段代码会导致以下错误:
/镜子/dev/Groovy/src/错误/BugCheck。groovy: 17:[静态类型检查]-方法的引用是不明确的。[void bug.BugCheck$Child#method(float), void bug.BugCheck$Child#method(float)]
这是Groovy中的一个bug,还是我在这里错过了什么?
方法签名各不相同,但由于Parent
方法有默认值,调用它时没有boolean
值会产生歧义:您是指没有参数的Child
方法,还是具有默认boolean
的父方法?
如果Child
用完全相同的签名声明了一个方法,那么歧义性就被解决了。
从语言设计(或用法?)的角度来看,这是一个相当不可靠的推理;在IMO中,如果没有提供boolean
,应该调用Child
方法。