在Groovy中,如果我有:
def say(msg = 'Hello', name = 'world') {
"$msg $name!"
}
然后致电:
say() // Hello world!
say("hi") // Hi world!
say(null) // null world!
为什么最后一个字体被解释为null
并且没有应用默认值?这是否会破坏默认方法参数值的目的?我确实认为传递null
与传递任何w / r / t参数长度不同。
我的问题是,如果我现在有一个将集合作为参数的方法:
def items(Set<String> items = []) {
new HashSet<>(items)
}
如果我拨打NullPointerException
,这将抛出items(null)
,但如果我只说items()
,则可以正常工作。为了使其正常工作,我必须将该行更改为new HashSet<>(items ?: [])
,这似乎也破坏了使用默认方法参数值的全部目的。
我在这里缺少什么?
答案 0 :(得分:8)
在Groovy中,默认参数会生成重载方法。因此,这个:
public String[] splitString(String s) {
List<String> results = new ArrayList<>();
int start = 0;
while (true) {
int next = s.indexOf('-', start);
if (next < 0) {
break;
}
results.add(s.subString(0, next));
results.add(s.subString(next + 1));
start = next + 1;
}
return results.toArray(new String[results.size()]);
}
将生成这两种方法(我使用def items(Set<String> items = []) {
new HashSet<>(items)
}
来获取这些值):
javap
因此,当您致电public java.lang.Object items(java.util.Set<java.lang.String>);
public java.lang.Object items();
时,您实际上传递了一些值,并且将使用items(null)
方法。
您还可以参考有关默认参数的this question。