[ https://issues.apache.org/jira/browse/GROOVY-11265?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17803593#comment-17803593 ]
Eric Milles commented on GROOVY-11265: -------------------------------------- In Groovy 3 (and I suspect Groovy 4.0.12 and lower) the trait helper method created for {{multiplyBy}} does not have functional interface metadata on the lambda expression. Classgen creates a typical closure class in this case, which has a {{rehydrate(delegate,owner,thisObject)}} method. And the cast adapts the closure instance into a {{Function}}. {code:groovy} interface MyInterface { class MyInterfaceHelper { Function<Integer,Integer> multiplyBy(MyInterface $self, int multiplicand) { return /*lambda*/.rehydrate($self,$self,$self) } } } {code} > Runtime rehydrate error for closure in interface default method > --------------------------------------------------------------- > > Key: GROOVY-11265 > URL: https://issues.apache.org/jira/browse/GROOVY-11265 > Project: Groovy > Issue Type: Bug > Components: Compiler, Static compilation > Affects Versions: 4.0.13, 4.0.17 > Reporter: Christopher Smith > Assignee: Eric Milles > Priority: Critical > > When using an interface default method (implemented in Groovy 4 as a trait) > that returns an instance of a functional interface defined by a lambda, > compilation succeeds but runtime invocation produces > {code} > groovy.lang.MissingMethodException: No signature of method: > com.example.MyInterface$Trait$Helper$$Lambda$2132/0x0000000800e24c40.rehydrate() > is applicable for argument types: (com.example.MyImplementation...) values: > [com.example.MyImplementation@2a7087a8, ...] > at > org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:72) > at > org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:184) > at com.example.MyInterface$Trait$Helper.curry(MyInterface.groovy:19) > at com.example.MyImplementation.curry(MyImplementation.groovy) > {code} > Update: This appears to be a problem introduced between 4.0.12 and 4.0.13 and > shows up only when _the interface_ is defined as {{@CompileStatic}}. While I > understand that the party line is that traits and ASTTs aren't guaranteed to > be compatible, (1) this was working perfectly previously and (2) the > compiler's implementation of interface default methods as traits is an > implementation detail and should have as limited a blast radius as practical. -- This message was sent by Atlassian Jira (v8.20.10#820010)