Scott Murphy Heiberg created GROOVY-12599:
---------------------------------------------

             Summary: STC accepts a Closure<R> value passed to or returned as a 
functional interface whose method does not return R
                 Key: GROOVY-12599
                 URL: https://issues.apache.org/jira/browse/GROOVY-12599
             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.CompileStatic // or @TypeChecked
class C {
    static String take(Supplier<String> s) { s.get().toLowerCase() }
    static Supplier<String> make() { Closure<Integer> c = { 1 }; c }

    static void main(args) {
        Closure<Integer> c = { 1 }
        take(c)
        make().get().toLowerCase()
    }
}
{code}
Actual: the code compiles. Under static compilation both calls throw
{noformat}
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class 
java.lang.String
{noformat}
(MissingMethodException under @TypeChecked). The same happens for an instance 
of a non-generic subclass such as {{class D extends Closure<Integer>}} passed 
as the argument.

Expected: compile errors, as for a closure literal ("Cannot return value of 
type int for closure expecting java.lang.String"):
{noformat}
Cannot call C#take(java.util.function.Supplier<java.lang.String>) with 
arguments [groovy.lang.Closure<java.lang.Integer>]
Cannot return value of type groovy.lang.Closure<java.lang.Integer> for method 
returning java.util.function.Supplier<java.lang.String>
{noformat}

For a method argument, 
StaticTypeCheckingSupport.typeCheckMethodArgumentWithGenerics accepts any 
Closure for a SAM-type parameter and assumes the return type was checked 
earlier. That is only true for a closure literal. For a return statement, 
generics are compared only when the value's type implements the return type, 
which Closure does not for most SAM types.

Seen in 4.0.33, 5.0.8 and 6.0.0.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to