Eric Milles created GROOVY-8832:
-----------------------------------

             Summary: Type parameters for trait method and its bridge method
                 Key: GROOVY-8832
                 URL: https://issues.apache.org/jira/browse/GROOVY-8832
             Project: Groovy
          Issue Type: Question
          Components: Compiler
    Affects Versions: 2.5.3, 2.4.15
            Reporter: Eric Milles
         Attachments: Events.zip

This is related to GROOVY-8815.  When compiling a class that implements the 
trait {{grails.events.Events}} I am seeing different results for the type 
parameters.  I'm not sure what the correct generics signatures should be.  
*What are the correct generics for this scenario?*

{code:groovy}
import grails.events.Events
class Service implements Events {}
{code}
And the relevant excerpt from Events:
{code:groovy}
def <E extends Event<?>> Bus notify(Object key, Closure<E> supplier)
{code}

When {{Service}} is compiled with Gradle, the following methods are created in 
the class file.  The synthetic method generics look okay, but the bridge method 
generics have {{E}} as {{java.lang.Object}}.
{code}
  // Method descriptor #96 
(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
  // Signature: 
<E:Lreactor/bus/Event<+Ljava/lang/Object;>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
  // Stack: 8, Locals: 4
  public synthetic reactor.bus.Bus 
grails_events_Eventstrait$super$notify(java.lang.Object param0, 
groovy.lang.Closure param1);

  // Method descriptor #96 
(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
  // Signature: 
<E:Ljava/lang/Object;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
  // Stack: 5, Locals: 4
  
@org.codehaus.groovy.transform.trait.Traits.TraitBridge(traitClass=grails.events.Events,
    desc="(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;")
  public reactor.bus.Bus notify(java.lang.Object arg1, groovy.lang.Closure 
arg2);
{code}

By contrast, when {{Service}} is compiled with Gradle, the following methods 
are created in the class file.  Again the synthetic method looks okay; more 
accurate to the original I think.  However the generics for the bridge method 
contain the unresolved type parameter {{T}}.  This is the actual bug I'm 
chasing, but I can't say what the right generics should be and why 
Gradle/Groovyc and Groovy-Eclipse have different answers for both methods.
{code}
// Method descriptor #150 
(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
  // Signature: 
<E:Lreactor/bus/Event<*>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
  // Stack: 8, Locals: 4
  public synthetic reactor.bus.Bus 
grails_events_Eventstrait$super$notify(java.lang.Object arg0, 
groovy.lang.Closure arg1);

  // Method descriptor #150 
(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
  // Signature: 
<E:Lreactor/bus/Event<TT;>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
  // Stack: 5, Locals: 4
  
@org.codehaus.groovy.transform.trait.Traits.TraitBridge(traitClass=grails.events.Events,
    desc="(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;")
  public reactor.bus.Bus notify(java.lang.Object arg1, groovy.lang.Closure 
arg2);
{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to