维基百科的有关Groovy编程语言的当前文章解释说:“大多数有效的Java文件也是有效的Groovy文件”,并给出以下Java代码示例:
for (String it : new String[] {"Rod", "Carlos", "Chris"})
if (it.length() <= 4)
System.out.println(it);
然后在Groovy中同样实现:
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
注意,在第一个例子中,我们使用了非常普通的Java方法,java.lang.String.length()。在第二个例子中,这个方法已经神秘地被替换成了一个名为size()
的方法调用。我已经验证过第二个例子是有效的Groovy代码,并且具有正确的行为。
java.lang.String
没有一个名为size()
的方法。Groovy不会为了自己的目的而对String
进行子类化:
String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
它也不会向 String
对象中添加额外的方法:
// [...]
for (def method : c.getMethods()) {
println method.getName()
}
// prints a whole bunch of method names, no "size"
然而,这段代码仍然能够正常工作:
// [...]
println s.size() // "0"
我找不到任何Groovy文档来解释这个问题。
size()
方法从哪里来?- 为什么它不出现在对象上?
- 为什么要添加它?
length()
有什么问题,为什么不推荐使用?java.lang.String
还有哪些其他附加方法?- 其他标准类呢?
length()
不是很一致(更不用说Array.length
了!),而集合API使用的是size()
。 - JimmyBsize
方法,而length
仍然存在。 - tim_yates