首页 文章

使用Integer键的Groovy映射 - DefaultGroovyMethods中的'getAt'无法应用于(java.lang.Integer)

提问于
浏览
2

我刚刚开始练习Groovy,我有一个与 Map 和IDEA IDE相关的问题 .

当我尝试使用 Integer 作为 Map 的键时,为什么IDEA会向我显示以下通知?这个简单的Groovy脚本工作正常,打印正确的结果 .

screenshot

list = [4, 7, 3, 7, 7, 1, 4, 2, 4, 2, 7, 5]

map = [:]
list.each {
    t = map[(it)]
    map[(it)] = t != null ? t + 1 : 1
}

map.each {key, value -> if (value == 1) println key}

1 回答

  • 1

    这是因为IntelliJ IDEA将 map 变量视为 Object - 如果在变量前面缺少静态类型或关键字 def ,似乎IDEA不遵循类型推断 . 如果你看一下 DefaultGroovyMethods ,你会发现 Object 类型只有一种方法 getAt

    public static Object getAt(Object self, String property) {
        return InvokerHelper.getProperty(self, property);
    }
    

    这就是IDEA警告你缺少方法 getAt(Object self, Integer property) 的原因,因为它不知道 map 实际上是 Map 而不是 Object .

    请遵循官方Groovy的指导原则:

    可以使用类型(如String)或使用关键字def:String x定义变量
    def o
    资料来源:http://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#_variable_definition

    如果将变量定义为

    def map = [:]
    

    IntelliJ不再抱怨了 .

相关问题