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编译这段代码会导致以下错误:
/mirror/dev/Groovy/src/bug/BugCheck.groovy:17: [静态类型检查] - 对方法的引用不明确。无法选择[void bug.BugCheck $ Child#method(float),void bug.BugCheck $ Child#method(float)]
这是Groovy中的错误,还是我错过了什么?
答案 0 :(得分:2)
方法签名各不相同,但由于Parent
方法具有默认值,因此调用它时没有boolean
值会产生歧义:您是指没有参数的Child
方法,或者父母有默认boolean
?
如果Child
声明具有完全相同签名的方法,则解决歧义。
从语言设计(或用法?)的角度来看,这是一个非常不稳定的推理; IMO如果未提供Child
,则应调用boolean
方法。国际海事组织有理由感到困惑。