Lyuben Atanasov created GROOVY-9977:
---------------------------------------
Summary: @CompileStatic does not work for 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: 4.0.0-alpha-2, 3.0.7
Environment: OpenJDK8
Reporter: Lyuben Atanasov
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)