Groovy中int和Integer类型的区别

11

我刚开始学习Groovy,并且正在阅读《Groovy in Action》。在这本书中,我看到了这样一句话:无论您将变量声明或转换为int或Integer类型,都没有关系。Groovy始终使用引用类型(Integer)。

因此,我尝试将null值分配给类型为int的变量。

int a = null

但是它给我以下异常

org.codehaus.groovy.runtime.typehandling.GroovyCastException: 无法将类为“null”的对象“null”转换为类“int”。请尝试使用“java.lang.Integer” at Script1.run(Script1.groovy:2)

然后我试图将null值赋给类型为Integer的变量

Integer a = null

它正常工作。

有人可以帮我理解groovy如何表现或背后的原因吗?

3个回答

8
核心问题在于原始类型不能为null。Groovy通过自动装箱来解决这个问题。
如果您将null值存储在数字中,则无法将其存储在int/long/etc字段中。将null number转换为0是不正确的,因为这可能是有效值。Null表示尚未选择任何值或选项。

int是一种原始类型,不被视为对象。只有对象可以具有null值,而int值无法为null,因为它是一个值类型而不是引用类型。

对于原始类型,我们有固定的内存大小,即对于int,我们有4个字节,而null仅用于对象,因为它们的内存大小不固定。

因此,默认情况下我们可以使用:

int a = 0

5

Groovy在调用基本类型时使用包装器类型。

int a = 100
assert Integer == a.class

Groovy在使用int值之前将其包装成Integer类型。但是,如果变量是int(原始类型),而不是Integer,则Groovy无法将int值设置为null。

int a = 100
int b = 200
a + b not int + int, but Integer + Integer

1
据我理解,如果您使用字面量,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

这是您在此情况下看到的内容。


抱歉,我仍然无法理解原因。 - Abhinandan Satpute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接