[
https://issues.apache.org/jira/browse/GROOVY-11776?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18028859#comment-18028859
]
Eric Milles commented on GROOVY-11776:
--------------------------------------
There are two problems involved here:
1) When adding trait Foo into class Bar, the forwarder methods look like this:
{code:groovy}
@TraitBridge(traitClass=Foo, desc="...")
Object foo(Object o) {
Foo$TraitHelper.foo(this, o)
}
@TraitBridge(traitClass=Foo, desc="...")
Object foo(Map<String, Object> m) {
Foo$TraitHelper.foo(this, m)
}
{code}
The two calls work the same when the argument is null, since there is no
target metadata and the methods are not {{@CompileStatic}}.
2) The call expr "foo((Object) null)" creates a {{PojoWrapper}} on the runtime
side so that the Object typecast is preserved. This is preserved throughout
the forwarding to the trait helper method in Groovy 5, which is why method
selection is consistent. GROOVY-6146 and GROOVY-11203 are the likely changes
that affected argument propagation.
> Overload resolution of trait methods does not work properly
> -----------------------------------------------------------
>
> Key: GROOVY-11776
> URL: https://issues.apache.org/jira/browse/GROOVY-11776
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.5.23, 4.0.26, 3.0.25, 5.0.1
> Reporter: Björn Kautler
> Assignee: Eric Milles
> Priority: Major
>
> Given this snippet:
> {code:groovy}
> trait Foo {
> def foo(Object o) {
> println("foo(o)")
> }
> def foo(Map<String, Object> m) {
> println("foo(m)")
> }
> }
> class Bar implements Foo {
> def bar(Object o) {
> println("bar(o)")
> }
> def bar(Map<String, Object> m) {
> println("bar(m)")
> }
> }
> new Bar().with {
> foo((Object) null)
> foo(null as Object)
> bar((Object) null)
> bar(null as Object)
> }
> (new Object() as Foo).with {
> foo((Object) null)
> foo(null as Object)
> }
> {code}
> In Groovy 2.5, 3.0 and 4.0 {{bar}} uses the {{Object}} variant as expected,
> but {{foo}} uses the {{Map}} variant for some reason.
> In Groovy 5.0.alpha that is still on groovyconsole.dev this was fixed and
> both used the {{Object}} variant as expected.
> In 5.0.1 this is also broken again, behaving like before.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)