Groovy针对集合类型有一个size属性吗?

9

我写了一段代码,其中我正在检查一个ArrayList的大小,如下:

[1,2,3].size

在Groovy控制台和Grails嵌入式Tomcat服务器上一切正常。但是一旦我将此代码部署到WebSphere应用程序服务器上,就会收到一个异常报告:

Exception evaluating property 'size' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: size for class: java.lang.Integer.

经过一段时间的调试、测试和数不清的WTF,我意识到方法调用缺少了括号。属性符号应该不起作用,因为Collection没有getSize()方法(只有size()),这是很有道理的。
令我感到困惑的是,为什么Groovy控制台和Grails上的someCollection.size可以正常工作?
Grails和Groovy控制台版本均为2.3.6。

Groovy的版本是否有所不同? - Opal
1
ArrayList 在 sun jdk 1.7u67 中有一个私有变量 size。我预计不同的 JDK 会有所不同。 - cfrick
Grails框架已经捆绑在应用程序中,因此两者相同。不同的JDK可能是一个非常好的选择。WebSphere可能有自己的实现。 - kaskelotti
你能找出哪一个并反汇编它吗?你正在使用sun/openjdk,在那里它可以工作吗? - cfrick
1
服务器版本可能是:java version "1.6.0" Java(TM) SE Runtime Environment (build pap6460sr12-20121025_01(SR12)) IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460sr12-20121024_126067 (JIT enabled, AOT enabled) J9VM - 20121024_126067 JIT - r9_20120914_26057 GC - 20120928_AA) JCL - 20121014_01至少暂时我得跳过反汇编。 - kaskelotti
显示剩余2条评论
2个回答

7

ArrayList 在至少Sun JDK 1.7u67和OpenJDK 1.6中拥有一个私有的 int size,该属性可以被 groovy 访问。如果您的其他环境使用另一个 JDK,则可能不存在此变量,这时 groovy 就会退回到解释 [1,2,3]*.getSize(),但这会失败。


2
ArrayList的实现中,代码确实没有size成员变量。 - kaskelotti
如果列表为空,解释*.getSize()将不会失败,并返回一个空列表。所以[].size == [],非常令人困惑。 - undefined

1
在 Groovy 版本:2.4.21(Jenkins:2.387.2)中,我们可以使用 size() 方法。
添加 getSize() 不起作用。错误信息:
groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.getSize() is applicable for argument types: () values: []
Possible solutions: size(), size(), size(), get(int), get(int), getAt(int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接