为什么Map在Groovy中不适用于GString?

米哈尔·科尔达斯(Michal Kordas)

使用以下代码段,我无法gString从地图中检索

def contents = "contents"
def gString = "$contents"

def map = [(gString): true]

assert map.size() == 1 // Passes
assert gString.hashCode() == map.keySet().first().hashCode() // Passes, same hash code
assert map[gString] // Fails

那到底怎么可能呢?

断言消息清楚地表明Groovy存在严重错误:

assert map[gString] // Fails
       |  ||
       |  |contents
       |  null
       [contents:true]

这与为什么Groovy在字典中看不到某些值的问题不同?那里的第一个答案表明:

您正在将GString实例添加为地图中的键,然后使用String实例搜索它们。

在这个问题中,我明确地添加GString并尝试检索GString

同样,为什么在映射GString键的方式上没有不同的行为呢?也没有在GStringImpl上使用equals()和==的Groovy不同结果对我有答案。我不会变异任何东西,也不会String混淆GString

巴尔罗格

tl; dr:您似乎在Groovy的运行时参数重载评估中发现了一个错误。

回答:

map[gString]map.getAt(gString)通过Groovy的运算符重载机制可以在运行时直接进行评估到目前为止,一切都很好,但是现在一切都开始变糟了。JavaLinkedHashMapgetAt在其类型层次结构中的任何地方都没有方法,因此Groovy必须改为使用动态关联的mixin方法(实际上,该语句有点相反。Groovy在类层次结构中使用已声明的方法之前先使用mixin方法。)

因此,总而言之,Groovy决心map.getAt(gString)使用category方法DefaultGroovyMethods.getAt()轻松自在,对不对?除了此方法具有大量不同的参数重载之外,其中一些可能适用,尤其是当您考虑Groovy的默认参数强制时。

不幸的是,DefaultGroovyMethods.getAt(Map<K,V>,K)Groovy并未选择似乎是完美的选择,而是选择了关键参数DefaultGroovyMethods.getAt(Object,String)强制GString转换为String由于实际的密钥实际上是a GString,因此该方法最终无法找到该值。

对我而言,真正的杀手is是,如果直接从代码中执行参数重载解析(而不是在运算符解析和类别方法选择之后执行),那么Groovy会做出正确的重载选择!也就是说,如果替换此表达式:

map[gString]

带有以下表达式:

DefaultGroovyMethods.getAt(map,gString)

然后正确地解析了参数重载,并找到并返回了正确的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么__dir __()不适用于python中的模块?

来自分类Dev

为什么HTML中“ <input>”标记中的“ size”属性仅适用于TEXT而不适用于NUMBER?

来自分类Dev

为什么我的函数适用于矩阵但为什么不适用于向量?

来自分类Dev

为什么Array.map似乎不适用于未定义值的数组

来自分类Dev

为什么列表<地图<?扩展数,?extends Number>> 不适用于 List<Map<Integer,Double>>

来自分类Dev

为什么 R 中的多边形适用于全曲线而不适用于半曲线?

来自分类Dev

为什么忽略SIGTRAP不适用于asm?

来自分类Dev

为什么绑定不适用于动画?

来自分类Dev

为什么python re模块不适用于@?

来自分类Dev

为什么向左滑动不适用于Jquery mobile?

来自分类Dev

为什么这些条件不适用于模板类型?

来自分类Dev

为什么乘法不适用于读取主机值

来自分类Dev

为什么strtok不适用于stringstream?

来自分类Dev

为什么ng-bind不适用于数组?

来自分类Dev

为什么输入模式属性不适用于数字?

来自分类Dev

为什么$别名不适用于此jQuery函数

来自分类Dev

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

来自分类Dev

为什么GCC优化不适用于valarrays?

来自分类Dev

为什么`Condition`属性不适用于`ItemGroup`元素?

来自分类Dev

为什么角度绑定不适用于服务原语

来自分类Dev

为什么CustomStringConvertible协议不适用于Int?

来自分类Dev

为什么此委托不适用于UITextView

来自分类Dev

自动装箱为什么不适用于Short(5)?

来自分类Dev

为什么cout不适用于pthreads?

来自分类Dev

为什么innerTEXT不适用于节点?

来自分类Dev

为什么CSS覆盖不适用于嵌套按钮?

来自分类Dev

为什么JUnit DataPoints方法不适用于原语?

来自分类Dev

为什么同步方法不适用于多线程

来自分类Dev

为什么“大于”不适用于char类型?

Related 相关文章

  1. 1

    为什么__dir __()不适用于python中的模块?

  2. 2

    为什么HTML中“ <input>”标记中的“ size”属性仅适用于TEXT而不适用于NUMBER?

  3. 3

    为什么我的函数适用于矩阵但为什么不适用于向量?

  4. 4

    为什么Array.map似乎不适用于未定义值的数组

  5. 5

    为什么列表<地图<?扩展数,?extends Number>> 不适用于 List<Map<Integer,Double>>

  6. 6

    为什么 R 中的多边形适用于全曲线而不适用于半曲线?

  7. 7

    为什么忽略SIGTRAP不适用于asm?

  8. 8

    为什么绑定不适用于动画?

  9. 9

    为什么python re模块不适用于@?

  10. 10

    为什么向左滑动不适用于Jquery mobile?

  11. 11

    为什么这些条件不适用于模板类型?

  12. 12

    为什么乘法不适用于读取主机值

  13. 13

    为什么strtok不适用于stringstream?

  14. 14

    为什么ng-bind不适用于数组?

  15. 15

    为什么输入模式属性不适用于数字?

  16. 16

    为什么$别名不适用于此jQuery函数

  17. 17

    为什么ExtractMpegFramesTest不适用于旋转的输入文件?

  18. 18

    为什么GCC优化不适用于valarrays?

  19. 19

    为什么`Condition`属性不适用于`ItemGroup`元素?

  20. 20

    为什么角度绑定不适用于服务原语

  21. 21

    为什么CustomStringConvertible协议不适用于Int?

  22. 22

    为什么此委托不适用于UITextView

  23. 23

    自动装箱为什么不适用于Short(5)?

  24. 24

    为什么cout不适用于pthreads?

  25. 25

    为什么innerTEXT不适用于节点?

  26. 26

    为什么CSS覆盖不适用于嵌套按钮?

  27. 27

    为什么JUnit DataPoints方法不适用于原语?

  28. 28

    为什么同步方法不适用于多线程

  29. 29

    为什么“大于”不适用于char类型?

热门标签

归档