爲什麼這會拋出異常?Groovy對象數組創建問題
messageSource.getMessage('UserService.msg.forgot.unknown', ["[email protected]"], null)
除非我做到這一點...
def Object[] args = ["[email protected]"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null)
爲什麼這會拋出異常?Groovy對象數組創建問題
messageSource.getMessage('UserService.msg.forgot.unknown', ["[email protected]"], null)
除非我做到這一點...
def Object[] args = ["[email protected]"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null)
因爲[ 「[email protected]」]計算爲一個ArrayList,而不是一個數組:
groovy:000> o = ["asdf"]
===> [asdf]
groovy:000> o.getClass()
===> class java.util.ArrayList
OTOH你的宣言創建一組對象:
groovy:000> Object[] args = ["asdf"]
===> [Ljava.lang.Object;@14e113b
和t他調用的方法需要一個數組。可以創建使用as
陣列:
Object[] args = ["asdf"] as Object[]
Groovy的創作者製作使更高級別的數據結構,例如鏈表慣用的一個點,而陣列存在使用Java的互操作性。
在他打碼機採訪約在設計語言所作出的選擇工作蓋伊斯蒂爾會談:
「有這個霍夫曼編碼問題,如果你想讓它簡潔, 事情是不得不因此,在設計一種語言時,你考慮的一個問題是'我想說的東西很容易說出來,而且很容易得到 對不對?但有了這樣的理解,在用完字符或符號後,你將不得不做出其他更難以說明的事情。「
它看起來像Groovy使列表更簡潔,數組變得更加冗長的副作用。
Nathan已經(正確)在語言層面解釋了這種行爲的原因。我只想提升一個抽象層次:爲什麼直接使用Spring的MessageSource
,首先呢?在Grails中有一個message
tag,封裝了消息來源:
g.message(code: 'UserService.msg.forgot.unknown', args: ["[email protected]"])
有道理,但似乎做一個麻煩使用的方法,我想我希望它是更多的「常規」 – 2009-12-21 17:33:20
你可以將其更改爲[ 「[email protected]」]。指定者()。沒有太多更好,但至少它是內聯的。 – 2009-12-21 18:09:49