为什么会抛出异常?
messageSource.getMessage('UserService.msg.forgot.unknown', ["test@mail.com"], null)
除非我这样做......
def Object[] args = ["test@mail.com"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null)
答案 0 :(得分:18)
因为[“test@mail.com”]的计算结果是ArrayList,而不是数组:
groovy:000> o = ["asdf"]
===> [asdf]
groovy:000> o.getClass()
===> class java.util.ArrayList
OTOH你的声明会创建一个对象数组:
groovy:000> Object[] args = ["asdf"]
===> [Ljava.lang.Object;@14e113b
并且您调用的方法需要一个数组。您可以使用as
:
Object[] args = ["asdf"] as Object[]
Groovy创建者强调制作更高级别的数据结构,例如列表惯用语,而数组则用于与Java的互操作性。
在工作中的编码员的访谈中,Guy Steele谈到了设计语言时的选择:
“有这个霍夫曼编码问题。如果你做一些简洁的事情, 因此,某些东西必须更加冗长。所以 设计一种语言,你想到的事情之一就是'什么是 我想要的东西很容易说,很容易得到 对?'但有了解,已经用完了字符或 为此目的的符号,你将不得不做出别的东西 有点难说。“
看起来Groovy的列表看起来更简洁,副作用就是数组变得更加冗长。
答案 1 :(得分:1)
Nathan已经(正确地)在语言层面解释了这种行为的原因。我只想提升一个抽象级别:为什么你首先直接使用Spring的MessageSource
?在Grails中有一个message
tag,它包含了消息源:
g.message(code: 'UserService.msg.forgot.unknown', args: ["test@mail.com"])