2014-02-06 82 views
0

這裏的(常規)類的一部分,在MongoDB中存儲一些數據:常規對象和原始的混亂

long save(Object data) { 

    def customerReference = getNextCustomerReference() 

    def map = ['customerReference': customerReference, 'data': data, 'created': new Date()] 

    BasicDBObject basicDBObject = new BasicDBObject(map) 
    collection.insert(basicDBObject) 
    customerReference 
} 

private long getNextCustomerReference() { 
    1234 
} 

即使我已經明確地說,我希望有一個原始的長,是什麼在數據庫最終是對象:

{ "_id" : ObjectId("52f3c0597d844b0fcee29013"), "customerReference" : NumberLong(1234), "data" : "original data", "created" : ISODate("2014-02-06T17:03:21.411Z") } 

但是,如果我改變返回類型爲變形點焊私有方法出現這種情況:

{ "_id" : ObjectId("52f3c1477d84698725f50fe5"), "customerReference" : 1234, "data" : "data", "created" : ISODate("2014-02-06T17:07:19.055Z") } 

這是我想要的行爲(存儲在數據庫中的一個原語)。

有人可以解釋這是因爲它的莫名其妙。當然,如果我按照自己的方式來定義類型,Groovy應該嘗試並尊重它?

+0

如果你做'long customerReference = getNextCustomerReference()'會怎麼樣? –

+0

作爲對象進入。更奇怪的是,如果我這樣做,並使方法def的返回類型,它將作爲一個對象。 – FinalFive

+0

如果您跳過'BasicDBObject'並直接進入'collection.insert(map)',該怎麼辦?我認爲這是允許的 –

回答

2

Groovy中幾乎總是自動autoboxes原始類型到它們的數量引用類型相當於:

long test_long() { 123l } 
int test_int() { 123 } 
def test_def() { 123 } 
def test_def_long() { 123l } 

long l = 42l 

assert test_long().class == Long.class 
assert test_int().class == Integer.class 
assert test_def().class == Integer.class 
assert test_def_long().class == Long.class 
assert l.class === Long.class 

如果刪除long返回類型,對象autoboxed到java.lang.Integer。看起來你的代碼像「基元」一樣處理Integer

前一段時間Groovy 1.8 introduced primitive type optimization,內部回退在某些情況下使用原始類型。這可以在某些情況下有所幫助,但是是不能直接使用的內部性能優化(通過使用某種語法結構或類似的東西)。

有時你可以通過顯式強制轉換來強制一個原語,但機會很高,它將通過方法調用和東西一路轉換爲引用類型。