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

Lyuben Atanasov commented on GROOVY-9977:
-----------------------------------------

The same issue appears in static fields as well:
{code}
class LambdaAssignedToField
{
        private static Comparator<Integer> myComparator = (int1, int2) -> 
Integer.compare(int1, int2);
}
{code}
Interestingly, though, if we rewrite the above statement slightly, it works:
{code}
class LambdaAssignedToField
{
        private static Comparator<Integer> myComparator;
        static {
                myComparator = (int1, int2) -> Integer.compare(int1, int2);
        }
}
{code}
It seems that whenever we make the assignment in a method context (in this 
example the method is {{<clinit>()}}) the problem is gone.

> @CompileStatic does not work when a class field has a lambda initializer
> ------------------------------------------------------------------------
>
>                 Key: GROOVY-9977
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9977
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation, Static Type Checker
>    Affects Versions: 3.0.7, 4.0.0-alpha-2
>         Environment: OpenJDK8
>            Reporter: Lyuben Atanasov
>            Priority: Major
>
> Using {{@CompileStatic}} when a field is initialized with a lambda:
> {code}
> class LambdaAssignedToField
> {
>       private Comparator<Integer> myComparator = (int1, int2) -> 
> Integer.compare(int1, int2);
> }
> {code}
> causes compilation errors:
> {noformat}
> Exception in thread "main" 
> org.codehaus.groovy.control.MultipleCompilationErrorsException: startup 
> failed:
> Script_28800dd8352617dbb4fe2e1957614875.groovy: 3: [Static type checking] - 
> Cannot find matching method java.lang.Integer#compare(java.lang.Object, 
> java.lang.Object). Please check if the declared type is correct and if the 
> method exists.
>  @ line 3, column 61.
>    yComparator = (int1, int2) -> Integer.co
>                                  ^
> Script_28800dd8352617dbb4fe2e1957614875.groovy: 3: [Static type checking] - 
> Cannot assign value of type groovy.lang.Closure <java.lang.Object> to 
> variable of type java.util.Comparator <Integer>
>  @ line 3, column 45.
>    rator<Integer> myComparator = (int1, int
> {noformat}
> The same code, used in the context of a method, works fine:
> {code}
> class LambdaAssignedToVariable
> {
>       public void test()
>       {
>               Comparator<Integer> myComparator = (int1, int2) -> 
> Integer.compare(int1, int2);
>       }
> }
> {code}
> In order to make the first example compile, I have to manually specify the 
> types of the lambda parameters and also cast it to the correct type:
> {code}
> class LambdaAssignedToFieldCast
> {
>       private Comparator<Integer> myComparator = (Comparator<Integer>) 
> (Integer int1, Integer int2) -> Integer.compare(int1, int2);
> }
> {code}
> The issue seems to exist since Groovy 3.0.0.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to