传递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关于默认参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |