I am just wondering what people's thoughts are on the different
approaches different parts of Groovy take for method resolution when
multiple methods are matched.
Given this code:
import groovy.transform.CompileStatic
interface FooA {}
interface FooB {}
class FooAB implements FooA, FooB {}
@CompileStatic
class TestGroovy {
static void test() { println new TestGroovy().foo(new FooAB()) }
def foo(FooB x) { 43 }
def foo(FooA x) { 42 }
}
TestGroovy.test()
The output will be 42 because FooA comes before FooB in the implements
clause for FooAB.
If we leave off the @CompileStatic, their will be a runtime exception:
groovy.lang.GroovyRuntimeException: Ambiguous method overloading for
method TestGroovy#foo
Given this trait example:
trait BarA { def bar() { println 42 } }
trait BarB { def bar() { println 43 } }
class BarAB implements BarA, BarB {}
new BarAB().bar()
the output will be 43 because BarB comes last in the implements clause.
It seems unfortunate that we have three differing ways to handle
resolution and I am wondering what appetite we might have for trying
to consolidate the approaches in some future version of Groovy.
Cheers, Paul.