Groovy可以在简单控制台的XSSFSheet上使用下标,但在IntelliJ中它可以';T
我有一个这种类型的变量:Groovy可以在简单控制台的XSSFSheet上使用下标,但在IntelliJ中它可以';T,groovy,intellij-idea,apache-poi,Groovy,Intellij Idea,Apache Poi,我有一个这种类型的变量:XSSFSheet(我使用ApachePOI从Excel中读取) 在简单的groovy控制台中,我可以执行工作表[4][5]来通过坐标访问某个单元格。当我在IntelliJ中尝试同样的事情时,它给了我一个例外 No signature of method: org.apache.poi.xssf.usermodel.XSSFSheet.getAt() is applicable for argument types: (java.lang.Integer) values:
XSSFSheet
(我使用ApachePOI从Excel中读取)
在简单的groovy控制台中,我可以执行工作表[4][5]
来通过坐标访问某个单元格。当我在IntelliJ中尝试同样的事情时,它给了我一个例外
No signature of method: org.apache.poi.xssf.usermodel.XSSFSheet.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
Possible solutions: getAt(java.lang.String), getRow(int), putAt(java.lang.String, java.lang.Object), wait(), last(), first()
我查看了参考资料,确实,XSSFSheet不能用int来索引。但是为什么在它附带的简单groovy控制台中可以这样做呢?我能在IntelliJ中做同样的事情吗?这是老问题了,我之所以回答这个问题,是因为我想知道你在上一篇评论中问了同样的问题,并找到了试图理解的答案 正如您在上一篇评论中提到的,groovy中的下标操作符转换为
getAt()
方法,正如您所说,XSSFSheet类在java中没有这样的方法
因为它确实可以从groovy调用,所以它确实存在于某个地方。通过一点元编程,我们可以得到以下结果:
def getAt = org.apache.poi.xssf.usermodel.XSSFRow.metaClass.getMetaMethod("getAt", [java.lang.Integer] as Class[])
println getAt
org.codehaus.groovy.runtime.dgm$240@e7edb54[name: getAt params: [int] returns: class java.lang.Object owner: interface java.lang.Iterable]
这意味着它来自Iterable
接口。尽管如此,在java中情况并非如此。但是groovy向标准java类添加了许多方法,实际上我们可以看到它向Iterable
添加了getAt()
方法
这并没有回答您最初的问题(为什么它在IntelliJ中不起作用?它应该在这里起作用),但它回答了评论中的一个问题。我本来会把它贴在那里的,但我缺乏声誉。对于intellij,你的确切意思是什么?你有一个类路径中有groovy-all.jar的项目吗?这个版本的groovy与您在shell中使用的版本完全不同吗?您是否尝试过
工作表['4'][5]
?工作表['4'][5]也不起作用。在我添加groovy-all.jar之后,它说:java.lang.LinkageError:interface itable初始化中的loader约束冲突:在解析当前类的方法“org.apache.xmlbeans.impl.store.Xobj$NodeXobj.getChildNodes()Lorg/w3c/dom/NodeList”时,org/apache/xmlbeans/impl/store/Xobj$NodeXobj和接口org/w3c/dom/Node的类加载器(实例)对于签名中使用的org/w3c/dom/NodeList类型有不同的类对象
我在IntelliJ中安装并配置了groovy gradle项目,所以我读到我不需要groovy all jar。是的,你不需要。首先应该说gradle,还是它真的只是在intellij中不起作用(例如,它在命令行中与gradlerun
一起工作)?现在,您在gradle中使用的groovy版本是什么,在shell中使用的版本是什么?这两个版本都使用2.3.7。但是看看这里,API根本没有指定getAt方法。那么,为什么在groovy控制台中我可以用int为它编制索引,groovy会不知何故找到它并创造一些奇迹呢?