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

Luke Daley commented on GROOVY-7582:
------------------------------------

FWIW, I've hit this in Ratpack. The Groovy API is based around closure coercion 
for the most part, so my basic strategy is to design for Java 8 which means 
that it works nice with Groovy. Unfortunately, I didn't know about this issue 
when I added some API.

> Closure to SAM coercion doesn't handle overloads with different SAM signatures
> ------------------------------------------------------------------------------
>
>                 Key: GROOVY-7582
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7582
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.4.4
>            Reporter: Luke Daley
>
> The following…
> {code}
> interface Action<T> {
>   void exec(T thing)
> }
> interface Block {
>   void exec()
> }
> class Container {
>   void m(Action<?> action) {}
>   void m(Block block) {} 
> }
> def c = new Container()
> c.m { -> 1 }
> {code}
> Yields…
> {code}
> groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method 
> Container#m.
> Cannot resolve which method to invoke for [class 
> ConsoleScript0$_run_closure1] due to overlapping prototypes between:
>       [interface Action]
>       [interface Block]
>       at ConsoleScript0.run(ConsoleScript0:16)
> {code}
> It seems that Groovy should be able to deal with the case where the SAM 
> parameter signatures are different. Java does this with lambda expressions. 
> That is, the following works in Java…
> {code}
> Container c = new Container();
> c.m(() -> {});
> c.m(arg -> {});
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to