使用括号表示法告诉 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)
}
我一直在与 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)
}