使用括号表示法告诉 Groovy 地图中对象的类型

Tell Groovy Type of Object in Map using Bracket Notation

我一直在与 Eclipse 斗争,强调属性或方法调用我使用方括号表示法引用的对象。这是一个简单的例子。寻找最有效和简洁的方式来告诉编译器这是一个文件,因此 .write 是有效的,所以不要在它下面加下划线。

对于新手读者,我正在动态制作地图以将文件及其内容添加到数组列表中。

def myOutputList = new ArrayList()
def myFileObject = new File("outputFile.txt")
def myFileContents = "Whargarble"

myOutputList.add([
    file:myFileObject,
    contents:myFileContents
])

myOutputList.each{
    it['file'].write(it['contents'])
}

您可以明确声明类型 - 然后 Eclipse 会配合。

在你的例子中:

File f = it['file']
f.write...

您也可以使用 class 而不是地图(同样,具有显式类型)

如果您需要成对的集合,为什么不使用 map 而不是 list? :) 但请注意键在地图中是唯一的。

def myOutputMap = [:]
def myFileObject = new File("outputFile.txt")
def myFileContents = "Whargarble"

myOutputMap[myFileObject] = myFileContents

myOutputMap.each { file, content ->
    file.write(content)
}

如果 Eclipse 仍然会抱怨类型,请定义类型

myOutputMap.each { File file, String content ->
    file.write(content)
}

如果你想继续使用列表,你可以试试 Raz 的建议。

还有一件小事。

def myOutputList = []

是定义 ArrayList 的更好方法! :)

Raz Abramov 发布的答案是一个很好的解决方案。我真希望有一种 "inline" 的方法来做到这一点。我确实找到了一种这样的方式(如下),但在这种情况下我更喜欢你的方式。

it['file'].invokeMethod('write',(it['contents']))

此外,对于那些想知道的人,我测试了 Raz 的解决方案以确保它没有将文件对象复制到一个新变量中(而且,每次循环时都不是一个新变量)。它没有制作任何副本。此方法创建一个指向当前 it['file'] 对象的临时指针,因此如人们所希望的那样非常高效。再次感谢拉兹。

myOutputList.each{
    File f = it['file']
    assert myFileObject.is(f)
}