[
https://issues.apache.org/jira/browse/GROOVY-9971?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17297537#comment-17297537
]
Eric Milles commented on GROOVY-9971:
-------------------------------------
In your first example, the conversion from GString to String is done at the
point of assignment, not at the point of return from closure. String is a
universal receiver and I'm pretty sure a groovy cast is written by classgen.
In your second example, the target type is Closure<String> but the closure
expression does not strictly conform to that. It sounds like you want to move
the string coercion from the assignment to the return. If the closure has
multiple return statements, would you expect the same to apply?
> @TypeChecked: Closure<String> no longer compatible with Closure<GString>
> argument
> ---------------------------------------------------------------------------------
>
> Key: GROOVY-9971
> URL: https://issues.apache.org/jira/browse/GROOVY-9971
> Project: Groovy
> Issue Type: Bug
> Components: Compiler
> Affects Versions: 3.0.7
> Environment: Windows 10
> jdk-11.0.10.9-hotspot
> IntelliJ 2020.3.2
> Reporter: mgroovy
> Priority: Major
>
> *Problem*
> A Closure<String> is in Groovy 3 no longer compatible with a closure that
> returns a GString (or String|GString), even though GString is autoconverted
> to String in Groovy.
> *Expected*
> A Closure returning a GString or a String|GString should be compatible with
> Closure<String>
> *Sample Code*
> {code:java}
> import groovy.transform.TypeChecked
> import org.junit.Ignore
> import org.junit.Test
> @TypeChecked
> class Groovy3_ClosureOfString_GString_Compatible {
> @Test @Ignore
> void 'Groovy 3-0-7 Closure with String return type not compatible with
> GString argument'() {
> final x = 123
> // Cannot find matching method
> execStringCls(Closure<groovy.lang.GString>)
> assert execStringCls { "x=$x" } == 'x=123'
> //assert execStringCls { "x=$x".toString() } == 'x=123' //
> works
> }
> @Test @Ignore
> void 'Groovy 3-0-7 Closure with String return type not compatible with
> GString argument 2'() {
> final x = 123
> // Cannot find matching method
> execStringCls(Closure<java.io.Serializable>)
> assert execStringCls { false ? 'abc' : "x=$x" } == 'x=123'
> //assert execStringCls { true ? 'abc' : "x=$x".toString() } ==
> 'x=123' // works
> }
> String execStringCls(Closure<String> cls) {
> cls()
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)