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

Eric Milles commented on GROOVY-11615:
--------------------------------------

The specific case given in the description works under Groovy 5.  The order of 
operations was changed slightly for method call checking.  Closures and lambdas 
were visited after finding the candidate method(s).  This was extended to 
method pointer and references, so that all functional elements get the same 
treatment.

This order change allows for more information to reduce the set of candidate 
methods for "getBytes".  Groovy 5 is able to work out a single method and 
record String instead of Object as the expected argument metadata.

The other examples that describe a weakness in the inferencing algorithm around 
collectors is represented in 10054.

> Groovy has trouble type inferencing for Collections. The offender is 
> Collectors.asBlah set of methods. It needs the generic type <A.Y.X> to be 
> added explicitly
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-11615
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11615
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>    Affects Versions: 4.0.24
>            Reporter: Saravanan
>            Assignee: Eric Milles
>            Priority: Minor
>
> {code:java}
> public class Interfaces {
>     public String myThing() {
>         var myArray = Arrays.asList("123", "1354");
>         var mySet = myArray.stream().collect(Collectors.toSet());
>         
>         // This call will fail
>         //      Failed to find class method 'getBytes(java.lang.Object)' or
>         //      instance method 'getBytes()' for the type: java.lang.String
>         // To make it work change the previous line to
>         //      var mySet = 
> myArray.stream().collect(Collectors.<String>toSet());
>         mySet.forEach(String::getBytes);
>     }
> }{code}
> Most Collectors.<methods> need a fully qualified type for the generic 
> parameter, without which the compile will fail (sometimes detect an Object 
> type instead of the right one)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to