2016-09-09 2 views
3

Я только начал изучать отличный и читаю «Groovy in Action». В этой книге я столкнулся с утверждением, что не имеет значения, объявляете ли вы или передаете переменную типа int или Integer.Groovy использует ссылочный тип (Integer) в любом случае.разница между int и целочисленным типом в groovy

Так что я попытался присвоить нулевое значение переменной с типом INT

int a = null 

Но это дает мне ниже исключением

org.codehaus.groovy.runtime. typehandling.GroovyCastException: не может передать объект 'null' с классом 'null' в класс 'int'. Попробуйте 'java.lang.Integer' вместо в Script1.run (Script1.groovy: 2)

Затем я попытался назначить нулевое значение переменной с типом Integer

Integer a = null 

и все работает нормально.

Может ли кто-нибудь помочь мне понять, как groovy ведет себя таким образом или причина этого?

ответ

3

Основная проблема заключается в том, что primitives не может быть пустым. Groovy подделывает это с помощью autoboxing.

Если вы храните в номере null значение, вы не можете сохранить его в поле int/long/etc. Неправильно преобразовывать null number в 0, так как это могут быть допустимые значения. Null означает, что пока не было сделано никакой ценности или выбора.

int является primitive type и не рассматривается как object. Только objects может иметь значение null пока int значение не может быть null, потому что это тип значения, а не ссылочный тип

Для primitive types мы фиксированный размер памяти т.е. int мы 4 bytes и null используется только для objects потому что размер памяти не фиксирован.

Так по умолчанию можно использовать: -

int a = 0 
0

Как я понимаю, Groovy использует типы обертки, если вы используете литералы. Например:

def a = 11 // equivalent to Object a = 11. 11 is an java.lang.Integer 

или

assert ['java.lang.Integer'] == [ 11, 22, 33 ]*.class*.name.unique() 

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

Вы можете сделать:

def a = 11 
a = 'ssss' 

но

int a = 11 // or int a 
a = 'ssss' 

дает GroovyCastException.

Это то, что вы видите в вашем случае

+0

Извините, но я до сих пор не в состоянии понять причину. –

2

Groovy использует типы оболочки во все времена, когда вы вызова примитивов

int a = 100 
assert Integer == a.class 

заводных принимает Int и завернуть его в Integer, прежде чем использовать его дорожит Но заводные не может установить значение int равным null, поскольку переменная is int (примитивный тип), но не Integer.

int a = 100 
int b = 200 
a + b not int + int, but Integer + Integer 
Смежные вопросы