[ 
https://issues.apache.org/jira/browse/GROOVY-9852?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17246606#comment-17246606
 ] 

Eric Milles commented on GROOVY-9852:
-------------------------------------

So there are two {{onSuccess}} methods to choose from.  One is 
{{onSuccess(Handler<E>)}} declared by {{io.vertx.core.Future}} and implemented 
by {{io.vertx.core.impl.future.FutureImpl}}.  The other is 
{{onSuccess(Object)}} declared by {{io.vertx.core.impl.future.Listener}} and 
implemented by {{io.vertx.core.impl.future.PromiseImpl}}.  Groovy is selecting 
the Object method when I sense your intent is the Handler method.

I can look into argument vs parameter matching.  I think the SAM-type matching 
of closures comes after or at the very least has lower precedence to direct 
matching.  You can overcome this by casting or coercing your closure inline or 
assigning it to local variable of type Handler.

{code:groovy}
@Grab('io.vertx:vertx-core:4.0.0')
import io.vertx.core.Promise

Promise p = Promise.promise()
assert !p.future().isComplete()
assert p.future() === p.future()
assert p.future() === p.future().onSuccess({ println it } as 
io.vertx.core.Handler)
p.complete('Done with Groovy!!!')
{code}


> Result is already complete (IllegalStateException)
> --------------------------------------------------
>
>                 Key: GROOVY-9852
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9852
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 3.0.5
>         Environment: Windows 10
> OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_272-b10)
>            Reporter: André Filipe Aloise
>            Assignee: Eric Milles
>            Priority: Major
>
> Steps:
> 1 - Consider this reproducer [https://github.com/ptomaszek/vertx-groovy]
> 2 - Edit build.gradle and change vertxVersion to '4.0.0.Beta1' (uses Groovy 
> 3.0.3)
> 3 - Edit org.example.MainGroovy and replace the code of main method with the 
> following:
> {code:java}
> Promise p = Promise.promise()
> p.future().onSuccess { println it }
> p.complete("Done with Groovy!!!"){code}
> The code runs fine.
> But, if in Step 2 the vertxVersion in build.gradle is changed to 
> '4.0.0.Beta2' (uses Groovy 3.0.5), the code from Step 3 will fail with an 
> IllegalStateException. 
> {code:java}
> Exception in thread "main" java.lang.IllegalStateException: Result is already 
> complete
>  at io.vertx.core.Promise.complete(Promise.java:67)
>  at io.vertx.core.Promise$complete$1.call(Unknown Source)
>  at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
>  at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>  at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
>  at org.example.MainGroovy.main(MainGroovy.groovy:17)
> {code}
> If you use @CompileStatic on main method with Step 3, with Beta2, it works 
> fine. The @CompileStatic is not necessary to run well with Vert.x 
> '4.0.0.Beta1'. A Java class with similar code will work using any version of 
> Vert.x (Beta1, Beta2, Beta3, CR1....), so doesn't looks like a Java or Vertx 
> issue.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to