[ 
https://issues.apache.org/jira/browse/GROOVY-9413?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eric Milles updated GROOVY-9413:
--------------------------------
    Fix Version/s: 2.5.17

> Groovy 3.0 seem to have a problem with <?>, can't handle it in Java interface 
> method when called from Groovy.
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-9413
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9413
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler
>    Affects Versions: 3.0.1
>         Environment: OSX Crapalina
>            Reporter: Tommy Svensson
>            Assignee: Eric Milles
>            Priority: Major
>             Fix For: 3.0.2, 2.5.17
>
>
> With the following code:
> {code:java}
> public interface APSBusRouter {
>         boolean send( @NotNull String target, @NotNull Map<String, Object> 
> message, @Optional @Nullable APSHandler<APSResult<?>> resultHandler );
> }
> {code}
> {code:groovy}
> void send( @NotNull String target, @NotNull Map<String, Object> message,
>                @Optional @Nullable APSHandler<APSResult<?>> resultHandler ) {
>     if ( validateBaseMessageStructure( message ) ) {
>         boolean valid = false
>         this.routerTracker.withAllAvailableServices() { APSBusRouter 
> apsBusRouter, @NotUsed Object[] args ->
>      --->   if ( apsBusRouter.send( target.trim(), message, resultHandler ) ) 
> {
>                     valid = true
>                 }
>         }
>         ...
> {code}
> There will be a compilation error:
> {noformat}
> Error:(236, 22) Groovyc: [Static type checking] - Cannot call 
> se.natusoft.osgi.aps.api.messaging.APSBusRouter#send(java.lang.String, 
> java.util.Map <java.lang.String, java.lang.Object>, 
> se.natusoft.osgi.aps.types.APSHandler <se.natusoft.osgi.aps.types.APSResult>) 
> with arguments [java.lang.String, java.util.Map <String, Object>, 
> se.natusoft.osgi.aps.types.APSHandler <APSResult>]
> {noformat}
> This because the resultHandler in the interface {{APSBusRouter}}  for send 
> method  is declared identical to the argument of same name in method, and 
> this argument is just passed on. Here the Groovy compiler cannot find the 
> send method called.
> But if the APSBusRouter interface is changed  and the <?> part after 
> APSResult is removed (making IDEA complain and correctly so !!) then this 
> compiles perfectly! This even though the passed resultHandler in this case is 
> not identical to the APSBusRouter.send(...) declaration of the resultHandler 
> argument. 
> Example on github:
> APSBusRouter.java: 
> https://github.com/tombensve/APS/blob/4a0e5d56d61d218e55c1eb3b5edec1c6d44a40ba/APS-APIs/src/main/java/se/natusoft/osgi/aps/api/messaging/APSBusRouter.java#L106
> APSBusProvider.groovy:  
> https://github.com/tombensve/APS/blob/4a0e5d56d61d218e55c1eb3b5edec1c6d44a40ba/APS-Libraries/APSCoreLib/src/main/groovy/se/natusoft/osgi/aps/core/service/APSBusProvider.groovy#L227
> Both of these links are on Branch "Groovy-3_0_1-Issue". Ignore the 
> annotations in methods, they are purely for documentation purpose, and yes 
> there is clearly a bug in this method :-), but it has nothing to do with this 
> issue.
> The workaround for this is to remove the <?> part in APSBusRouter.send(...) 
> method declaration.
> Personally I'm starting to think that maybe it is the "<?>" expression Groovy 
> has a problem with. The interface is in this case done in Java! But then 
> again in APSBusProvider.groovy it does allow this in the send(...) method 
> declaration. Maybe Groovy sees <?> differently than Java ? That is, Groovy 
> code accepts this, but it does not mean the same thing as in Java ?
>  
>   



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to