2011-08-20 45 views
1

我是新來的Groovy,和我讀一個項目grettyGroovy中`ObjectMapper mapper = []`的含義是什麼?

import org.codehaus.jackson.map.ObjectMapper 
class JacksonCategory { 
static final ObjectMapper mapper = [] 
    ... 
} 

我不明白的代碼ObjectMapper mapper = [],這是什麼意思[]這裏的來源是什麼?我認爲這是一個list,但如何將它分配給ObjectMapper


UPDATE

取決於Dunes's answer,似乎[]意味着invocation of default constructor。因此,它的意思是:

static final ObjectMapper mapper = new ObjectMapper() 

但是:

String s = [] 
println s // -> it's `[]` not `` 

而且

Integer i = [] 

拋出異常:

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[]' 
with class 'java.util.ArrayList' to class 'java.lang.Integer' 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[]' with class 
'java.util.ArrayList' to class 'java.lang.Integer' 

回答

6

這是對ObjectMapper的默認構造函數的調用。

http://mrhaki.blogspot.com/2009/09/groovy-goodness-using-lists-and-maps-as.html

似乎[]總是作爲一個空的ArrayList創建的,但在分配給一個單獨的類型常規試圖做的強制類型轉換,找到一個合適的構造函數。

使用字符串,它只是調用列表中的toString方法,並使該字符串。對於它尋找具有適當數量和類型的參數的構造函數。

Groovy並不期望對擴展Number(Integer,BigDecimal等)的java庫類執行此操作,而是拋出ClassCastException。

例子:

class A { 
    String value; 
    A() { this("value"); } 
    A(String value) { this.value = value; } 
} 

def A defaultCons = []; 
// equivalent to new A() 
def A argsCons = ["x"]; 
// equivalent to new A("x") 
def list = [1,2]; 
// literal ArrayList notation 
def String str = []; 
// equivalent to str = "[]" 

println "A with default constructor: " + defaultCons.value; 
println "A with String arg constructo: " + argsCons.value; 
println "list: " + list; 
println "str: " + str; 
+0

謝謝。但是我發現了一些不同的東西:'String s = []',那麼's'是字符串'[]' – Freewind

+0

這是因爲字符串是一種特殊情況。 Groovy只是認爲你忘了在'[]' – Dunes

+0

周圍加引號,請看我更新的問題。有沒有什麼文章可以解釋這個功能? – Freewind