[ https://issues.apache.org/jira/browse/GROOVY-11558?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17915764#comment-17915764 ]
Jochen Theodorou commented on GROOVY-11558: ------------------------------------------- Method references are using Closure in 2.4.7 as well as in 4.0.24. That did not really change. And I agree with you. Once the method selection finds out the SAM conversion cannot be used here, it should have fallen back to Object > Method reference treated as closure in method dispatch > ------------------------------------------------------ > > Key: GROOVY-11558 > URL: https://issues.apache.org/jira/browse/GROOVY-11558 > Project: Groovy > Issue Type: Bug > Components: Compiler, Static Type Checker > Affects Versions: 4.0.24 > Reporter: Wouter Peers > Priority: Major > Labels: closure, dispatch, overloading > > When passing a method reference to an overloaded method of which one of the > signatures accepts a functional interface. Groovy seems to treat the method > ref as a closure and dispatches to the wrong method signature. > Example: > {code:groovy} > @FunctionalInterface > interface PresenceAware { > boolean isPresent() > } > class Presence { > static boolean isPresent(Object o){ > o != null > } > static boolean isPresent(PresenceAware p){ > p.isPresent() > } > } > class StringWrapper implements PresenceAware{ > private final String s > StringWrapper(String s) { > this.s = s > } > @Override > boolean isPresent() { > return s!= null && !s.empty > } > } > assert !Presence.isPresent(null) > assert Presence.isPresent('') > assert !Presence.isPresent(new StringWrapper('')) > assert Presence.isPresent(Integer.&compare) > // => MissingMethodException (in Groovy v4.0.24) > assert Presence.isPresent(Integer.&valueOf) > // => MethodSelectionException (in Groovy v4.0.24) > {code} > This code runs fine in Groovy v2.4.7—as I would expect, the method references > passed in the last two statements are treated as an Object when dispatching > to Presence::isPresent mehtod. > In Groovy v4.0.24 however the method references seem to be (wrongfully) > treated as closures and are dispatched to Presence::isPresent(PresenceAware) > signature. -- This message was sent by Atlassian Jira (v8.20.10#820010)