我刚刚开始学习groovy,我正在阅读“”。在这本书中,我遇到了这样一种说法:不管是声明变量还是强制转换变量为int类型,或者Integer.Groovy使用引用类型( Integer )的任何一种方式。
因此,我尝试将空值赋值给具有int类型的变量。
int a = null但它给了我以下的例外
org.codehaus.groovy.runtime.typehandling.GroovyCastException:不能将类为空的对象'null‘转换为'int’类。在Script1.run中尝试“java.lang.Integer”(Script1.groovy:2)
然后,我尝试将空值赋值给具有整数类型的变量。
Integer a = null而且它运行得很好。
有人能帮助我理解groovy的行为方式或背后的原因吗?
发布于 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,因为内存大小不是固定的。
因此,默认情况下,我们可以使用:
int a = 0发布于 2016-09-09 13:24:13
当调用原语时,Groovy始终使用包装器类型。
int a = 100
assert Integer == a.classgroovy在使用int值之前接受int并将其包装到Integer中,但是groovy不能将int值设置为null,因为变量是int(原始类型),而不是Integer。
int a = 100
int b = 200
a + b not int + int, but Integer + Integer发布于 2016-09-09 12:13:49
据我所知,如果使用文字,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。
这就是你在你的案子里看到的
https://stackoverflow.com/questions/39411057
复制相似问题