[
https://issues.apache.org/jira/browse/GROOVY-9971?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17297760#comment-17297760
]
mgroovy commented on GROOVY-9971:
---------------------------------
* @If the closure has multiple return statements: If it's doable & the return
type of the closure is String, yes. Groovy does its best to hide the fact that
GString is not String, only here it would require me to call toString
explicitly on the GString.
* From a user's perspective, in some cases what one wants is not really a
GString instance, but simply an interpolated string.
> @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)