2014-02-06 3 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") } 

Однако, если изменить тип возвращаемого значения DEF для частного метода это происходит:

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

, которого я хочу (примитив, хранящийся в db).

Может кто-нибудь объяснить это, потому что его озадачивает. Разумеется, если я уйду с пути, чтобы определить тип, 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, внутренний резерв для использования примитивных типов под капотом в определенных ситуациях. Это может помочь в некоторых ситуациях, но это внутренняя оптимизация производительности, с которой вы не можете напрямую воспользоваться (используя некоторую конструкцию синтаксиса или что-то в этом роде).

Иногда вы можете заставить примитив явным приведением в действие, но шансы высоки, он будет преобразован в ссылочный тип по пути через вызовы методов и прочее.

Смежные вопросы