You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Tommy Svensson (Jira)" <ji...@apache.org> on 2020/02/19 17:10:00 UTC

[jira] [Updated] (GROOVY-9413) Groovy 3.0 seem to have a problem with , can't handle it in Java interface method when called from Groovy.

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

Tommy Svensson updated GROOVY-9413:
-----------------------------------
    Description: 
With the following code:

{{    
    public interface APSBusRouter {

        boolean send( @NotNull String target, @NotNull Map<String, Object> message,
 @Optional @Nullable APSHandler<APSResult<?>> resultHandler );

}

    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
                }
            }
         ...
}}

There will be a compilation error:
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>]

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 ?
 
  


  was:
With the following code:

{{    public interface APSBusRouter {

        boolean send( @NotNull String target, @NotNull Map<String, Object> message,
 @Optional @Nullable APSHandler<APSResult<?>> resultHandler );

}

    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
                }
            }
         ...
}}

There will be a compilation error:
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>]

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 ?
 
  



> 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
>            Priority: Major
>
> With the following code:
> {{    
>     public interface APSBusRouter {
>         boolean send( @NotNull String target, @NotNull Map<String, Object> message,
>  @Optional @Nullable APSHandler<APSResult<?>> resultHandler );
> }
>     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
>                 }
>             }
>          ...
> }}
> There will be a compilation error:
> 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>]
> 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.3.4#803005)