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