【发布时间】:2015-10-04 16:56:02
【问题描述】:
关于 Groovy 编程语言的维基百科 current article 解释说“大多数有效的 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() 的方法的调用所取代。我有verified,第二个示例是有效的 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中添加了哪些其他额外方法? - 其他标准类呢?
【问题讨论】:
-
快速猜测一下:Groovy 可能正在使用它自己的 metaprogramming 来实现这样的魔法。
-
"length() 出了什么问题?" - 我一直觉得
length()不是真正一致的(更不用说Array.length!),而集合 API 使用size()。 -
而且它没有 "replace" 长度与大小(正如问题中提到的那样),它添加了一个新的
size方法,length仍然是那里 -
我假设
length()已被替换,因为有两种方法做完全相同的事情是没有意义的。
标签: java string groovy jvm-languages