[ 
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)

Reply via email to