Per Nyfelt created GROOVY-11621: ----------------------------------- Summary: Assigning null to a List or Map using bracket notation does not work with @CompileStatic Key: GROOVY-11621 URL: https://issues.apache.org/jira/browse/GROOVY-11621 Project: Groovy Issue Type: Improvement Components: Compiler Affects Versions: 4.0.26 Reporter: Per Nyfelt
I was recently experimenting with @CompileStatic for performance improvements and noticed that when using the short notation of putAt to assign a null value I get the following compilation error [Static type checking] - Cannot call <T> org.codehaus.groovy.runtime.DefaultGroovyMethods#putAt(java.util.List<T>, int, T) with arguments [java.util.List<java.lang.String>, int, java.lang.Object] Here is an example: import groovy.transform.CompileStatic import org.junit.jupiter.api.Test @CompileStatic class PutAtTest { @Test void testList() { // These all work def list = ['a', 'b', 'c'] list[0] = 'aa' assert list[0] == 'aa' list.set(2, null) assert list[2] == null list.putAt(0, null) assert list[0] == null // This Fails list[1] = null assert list[1] == null : "Short notation not working when assigning null" } @Test void testMap() { // These all work def map = [a: 'foo', b: 'bar', c: 'baz', d: 'qui'] map['a'] = 'aa' assert map['a'] == 'aa' map.put('c', null) assert map['c'] == null map.putAt('a', null) assert map['a'] == null map.d = null assert map['d'] == null // This Fails map['b'] = null assert map['b'] == null : "Short notation not working when assigning null" } } As pointed out by [~paulk] on the users list, a workaround is to cast e.g. list[1] = (String)null map['b'] = (String)null But it would be groovier if assigning null using short bracket notation "just worked". Also note that property notation for maps works (map.d = null) but fails with brackets (map['d'] = null) which is surprising from a user perspective as they are seen as alternative but equivalent ways to do the same thing. -- This message was sent by Atlassian Jira (v8.20.10#820010)