首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groovy中int和Integer类型的区别

问groovy中int和Integer类型的区别
EN

Stack Overflow用户
提问于 2016-09-09 11:56:56
回答 3查看 18.2K关注 0票数 9

我刚刚开始学习groovy,我正在阅读“”。在这本书中,我遇到了这样一种说法:不管是声明变量还是强制转换变量为int类型,或者Integer.Groovy使用引用类型( Integer )的任何一种方式。

因此,我尝试将空值赋值给具有int类型的变量。

代码语言:javascript
复制
int a = null

但它给了我以下的例外

org.codehaus.groovy.runtime.typehandling.GroovyCastException:不能将类为空的对象'null‘转换为'int’类。在Script1.run中尝试“java.lang.Integer”(Script1.groovy:2)

然后,我尝试将空值赋值给具有整数类型的变量。

代码语言:javascript
复制
Integer a = null

而且它运行得很好。

有人能帮助我理解groovy的行为方式或背后的原因吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-10 11:44:54

的核心问题是 原语 不能是空。Groovy用自动拳击来伪造它。

如果将null值存储在数字中,则不能将其存储在int/long/etc字段中。将null number转换为0是不正确的,因为这可能是有效值。Null意味着尚未做出任何价值或选择。

int是一个primitive type,不被认为是一个object。只有objects可以有null值,而int值不能是null,因为它是值类型而不是引用类型

对于primitive types,我们有固定的内存大小,即对于int,我们有4 bytes,而null只用于objects,因为内存大小不是固定的。

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

代码语言:javascript
复制
int a = 0
票数 7
EN

Stack Overflow用户

发布于 2016-09-09 13:24:13

当调用原语时,Groovy始终使用包装器类型。

代码语言:javascript
复制
int a = 100
assert Integer == a.class

groovy在使用int值之前接受int并将其包装到Integer中,但是groovy不能将int值设置为null,因为变量是int(原始类型),而不是Integer。

代码语言:javascript
复制
int a = 100
int b = 200
a + b not int + int, but Integer + Integer
票数 4
EN

Stack Overflow用户

发布于 2016-09-09 12:13:49

据我所知,如果使用文字,Groovy将使用包装器类型。例如:

代码语言:javascript
复制
def a = 11 // equivalent to Object a = 11. 11 is an java.lang.Integer

或

代码语言:javascript
复制
assert ['java.lang.Integer'] == [ 11, 22, 33 ]*.class*.name.unique()

尽管在定义中使用了特定类型,但编译器必须执行强制转换。

你可以:

代码语言:javascript
复制
def a = 11
a = 'ssss'

但

代码语言:javascript
复制
int a = 11 // or int a
a = 'ssss'

给GroovyCastException。

这就是你在你的案子里看到的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39411057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档