Scott Murphy Heiberg created GROOVY-12588:
---------------------------------------------
Summary: STC rejects a Closure<R> value assigned to a
parameterized functional interface ("Incompatible generic argument types")
Key: GROOVY-12588
URL: https://issues.apache.org/jira/browse/GROOVY-12588
Project: Groovy
Issue Type: Bug
Affects Versions: 5.0.8, 4.0.33, 6.0.0
Reporter: Scott Murphy Heiberg
{code:groovy}
import java.util.function.Supplier
@groovy.transform.TypeChecked // or @CompileStatic
def m() {
Closure<String> c = { 'a' }
Supplier<String> s = c
s.get()
}
assert m() == 'a'
{code}
Actual result:
{noformat}
[Static type checking] - Incompatible generic argument types. Cannot assign
groovy.lang.Closure<java.lang.String> to:
java.util.function.Supplier<java.lang.String>
{noformat}
Expected result: the script compiles and the closure is coerced to the
interface, as it is for a closure literal, for a raw target ({{Supplier s =
c}}) and in dynamic Groovy.
The same error is reported when the value comes from a property, a subscript, a
field assignment or a generic method returning a Closure, and for SAM types
with parameters such as {{Function<Integer,String>}}. The assignment check
accepts Closure to SAM coercion, but the generics check that follows it
compares {{Closure<String>}} with {{Supplier<String>}} as if Closure had to
implement the interface.
Seen in 4.0.33, 5.0.8, 6.0.0 and master.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)