为什么对这个groovy映射的containsKey()调用失败了?

时间:2018-03-30 23:30:53

标签: groovy linkedhashmap gstring

我想我正在搞砸这些声明,但我有一个groovy类,其字段定义如下:

Map<String, SomeType> _someField = [:]

我这样插入:

_someField.put( someStringVariable, someTypeInstance )

...然后,当我检查是否已经映射了我知道的密钥时,检查失败:

_someField.containsKey( someStringVariable )

我能让这个成功的唯一方法就是调用toString(),如下所示:

_someField.containsKey( someStringVariable.toString() )

我正在使用地图的通用声明,所以我的IDE让我自动完成值类型,所以我真的希望(我认为)在那里保留类型信息。

我已尝试将密钥类型从String更改为GString,但无济于事。我已经尝试将地图初始化从常规速记[:]更改为new LinkedHashMap<>,也无济于事。

是否可以保留类型信息并避免使用toString()

1 个答案:

答案 0 :(得分:1)

所以这种情况是在失败的实例中输入containsKey()的变量属于org.codehaus.groovy.runtime.GStringImpl类型,因为它们是由对地图值执行变量扩展的函数生成的,并且该函数正在为值而不是Java String创建groovy插值字符串。

快速检查变量的类型确认了类型问题,然后只需跟踪回来找到插值字符串的来源。