带有 Integer 键的 Groovy 映射 - DefaultGroovyMethods 中的“getAt”无法应用于 (java.lang.Integer)

ore*_*reh 5 groovy intellij-idea

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

Integer当我尝试用作地图的密钥时,为什么 IDEA 会显示以下通知?这个简单的 Groovy 脚本运行良好并打印正确的结果。

截屏

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}
Run Code Online (Sandbox Code Playgroud)

Szy*_*iak 5

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

public static Object getAt(Object self, String property) {
    return InvokerHelper.getProperty(self, property);
}
Run Code Online (Sandbox Code Playgroud)

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

请遵循 Groovy 官方指南:

变量可以使用其类型(如String)或使用关键字来定义def

String x
def o
Run Code Online (Sandbox Code Playgroud)

资料来源:http ://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#_variable_definition

如果您将变量定义为

def map = [:]
Run Code Online (Sandbox Code Playgroud)

IntelliJ 不会再抱怨了。