加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:30:09 所属栏目:大数据 来源:网络整理
导读:在Groovy中,如果我有: def say(msg = 'Hello',name = 'world') { "$msg $name!"} 然后打电话: say() // Hello world!say("hi") // Hi world!say(null) // null world! 为什么最后一个在字面上被解释为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(),则工作正常.为了使其正常工作,我必须将该行更改为新的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关于默认参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读