在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(Setitems = []) { new HashSet<>(items) }
如果我只是说,NullPointerException
如果我打电话,这将抛出一个items(null)
工作正常items()
.为了使其正常工作,我必须将行更改为,new HashSet<>(items ?: [])
这似乎也破坏了具有默认方法参数值的整个目的.
我在这里错过了什么?
在Groovy中,默认参数会生成重载方法.因此,这个:
def items(Setitems = []) { new HashSet<>(items) }
将生成这两个方法(我javap
以前得到这些值):
public java.lang.Object items(java.util.Set); public java.lang.Object items();
所以当你打电话给items(null)
你的时候,实际上是传递了一些价值,并且items(Set)
会使用方法.
您还可以参考有关默认参数的此问题.