传递null时应用默认groovy方法参数值

传递null时应用默认groovy方法参数值,groovy,default-value,Groovy,Default Value,在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参数长度不同 我这里的问题是,如果我现在有一个将集合作为参数

在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)
}
def项(设置项=[]){
新哈希集(项)
}
如果我调用
items(null)
,这将抛出
NullPointerException
,但如果我只说
items()
,效果很好。为了使其正常工作,我必须将行更改为
newhashset(items?:[])
,这似乎再次违背了使用默认方法参数值的全部目的


这里缺少什么?

在Groovy中,默认参数生成重载方法。因此,这:

def items(Set<String> items = []) {
  new HashSet<>(items)
}
因此,当您调用
items(null)
时,实际上您正在传递一些值,并且将使用
items(Set)
方法


您还可以参考关于默认参数的信息。

这完全有道理。谢谢,谢谢你的链接到另一个帖子。那么正确的答案是使用Elvis运算符吗?@icfantv,如果您不喜欢复制,则使用null作为默认参数,并使用Elvis+您想要的值
public java.lang.Object items(java.util.Set<java.lang.String>);
public java.lang.Object items();