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

时间:2015-12-30 18:04:34

标签: dictionary arraylist groovy types inference

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

对于新手读者,我正在制作一张地图,将文件及其内容添加到arraylist中。

arr.forEach(function(item) {
  this[item] = 1;
  var e = this.qwer; //1
}, this);

3 个答案:

答案 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)
}