传递 null 时应用默认 groovy 方法参数值
Applying default groovy method parameter value when passing null
在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)
}
如果我调用 items(null)
,这将抛出一个 NullPointerException
,但如果我只说 items()
,则工作正常。为了使其正常工作,我必须将行更改为 new HashSet<>(items ?: [])
这似乎再次破坏了具有默认方法参数值的整个目的。
我在这里错过了什么?
在Groovy中,默认参数生成重载方法。因此,这:
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)
时,您实际上是在传递一些值,并且将使用 items(Set)
方法。
默认参数也可以参考this question
在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)
}
如果我调用 items(null)
,这将抛出一个 NullPointerException
,但如果我只说 items()
,则工作正常。为了使其正常工作,我必须将行更改为 new HashSet<>(items ?: [])
这似乎再次破坏了具有默认方法参数值的整个目的。
我在这里错过了什么?
在Groovy中,默认参数生成重载方法。因此,这:
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)
时,您实际上是在传递一些值,并且将使用 items(Set)
方法。
默认参数也可以参考this question