我总是和使用括号表示法引用的对象上的eclipse下划线属性或方法作斗争。这是一个简单的例子。寻找最有效和简洁的方法告诉编译器这是一个文件,因此.write是有效的,所以不要强调它。
对于新手读者,我正在制作一张地图,将文件及其内容添加到arraylist中。
arr.forEach(function(item) {
this[item] = 1;
var e = this.qwer; //1
}, this);
答案 0 :(得分:1)
您可以明确说明类型 - 然后Eclipse将合作。
在你的例子中:
File f = it['file']
f.write...
您还可以使用类而不是地图(同样,使用显式类型)
答案 1 :(得分:0)
如果您需要对的集合,为什么不使用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是更好的方法! :)
答案 2 :(得分:0)
Raz Abramov发布的答案是一个很好的解决方案。我希望有一种“内联”的方式来做到这一点。我确实找到了一种这样的方式(下面),但在这种情况下我更喜欢你的方式。
it['file'].invokeMethod('write',(it['contents']))
另外,对于那些想知道的人,我测试了Raz的解决方案,以确保它没有将文件对象复制到一个新变量(并且每次循环时都不是新的变量)。它没有制作任何副本。此方法创建一个指向当前it ['file']对象的临时指针,因此非常有效,正如人们所希望的那样。再次感谢Raz。
myOutputList.each{
File f = it['file']
assert myFileObject.is(f)
}