Groovy对象数组创建问题

时间:2009-12-21 17:15:12

标签: grails groovy

为什么会抛出异常?

messageSource.getMessage('UserService.msg.forgot.unknown', ["test@mail.com"], null) 

除非我这样做......

def Object[] args = ["test@mail.com"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null) 

2 个答案:

答案 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"])