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