[ https://issues.apache.org/jira/browse/GROOVY-8045?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17542214#comment-17542214 ]
Eric Milles commented on GROOVY-8045: ------------------------------------- SC: https://github.com/apache/groovy/commit/496748a118a51b2dad33f9fd03a8039a1cf0127d > Implicit closure coercion doesn't work for elements of array of functional > objects > ---------------------------------------------------------------------------------- > > Key: GROOVY-8045 > URL: https://issues.apache.org/jira/browse/GROOVY-8045 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 2.4.7 > Reporter: Dimitar Dimitrov > Assignee: Eric Milles > Priority: Major > Labels: varargs > > Implicit closure coercion is described > [here|http://groovy-lang.org/releasenotes/groovy-2.2.html] - it assumes that > the closures don't need to be casted to functional types and the generic > types will be inferred by the compiler. > Here is one contrived case that works from Java (this is not production code > and is writen explicitly for illustration purposes): > {code} > public class GroovyAccDemo { > @SafeVarargs > public static <T, R> Function<T, R> ensemble(Function<T, R>... > hypotheses) { > return t -> Arrays.stream(hypotheses) > .map(v -> v.apply(t)) > .collect(Collectors.groupingBy(e -> e, > Collectors.counting())) > .entrySet() > .stream() > .max(Comparator.comparingLong(Map.Entry::getValue)) > .map(Map.Entry::getKey).orElseGet(() -> null); > } > public static void main(String[] args) { > Function<Integer, Integer> foo = ensemble( > i -> i*i, > i -> i+i, > i -> i*i - (i+i) > ); > } > } > {code} > Here the {{ensemble()}} method accepts a number of compatible functions and > returns a single function that calls all hypotheses and returns the most > popular result. > The main method illustrates that we can use the {{ensemble()}} function with > Java Lambdas without any explicit casts. > If we try to do the same in Groovy, we'll get runtime error (or compile error > if static compilation is enabled): > {code} > foo = GroovyAccDemo.<Integer, Integer> ensemble( > { i -> i * i }, > { i -> i + i }, > { i -> i * i - (i + i) } > ); > {code} > We can make it work by explicitly coercing the closures like this: > {code} > foo = GroovyAccDemo.ensemble( > { i -> i*i } as Function, > { i -> i+i } as Function, > { i -> i*i - (i+i ) } as Function > ); > {code} > This may seem as contrived use case, but it makes the use of certain API's > more tedious from Groovy than from Java, which just feels wrong ;-) -- This message was sent by Atlassian Jira (v8.20.7#820007)