GStrings show surprising behaviour when used as keys in collections or in comparisons. This lead to a lot of issues, e.g. (
GROOVY-626, GROOVY-2332, GROOVY-2330, GROOVY-951, GROOVY-2660, GROOVY-1959). The situation is even worse with lazy evaluation of closures in GStrings (see attached script).
Document that the user should
- use GString#toString() instead of putting GString (as a key) into a collection, and
- use GString#toString() instead of GString in comparisons with a String.
Coerce arguments that are instanceof GString to String if the receiving parameter's type is not GString or a type derived from GString.
I would prefer 1. over 2.