Groovyを学び始めたばかりで、「GroovyinAction」を読んでいます。この本で私は変数をint型とInteger型のどちらに宣言するかキャストするかは関係ありません。Groovyは参照型(Integer)をどちらの方法でも使用します。
だから私はnull値をタイプintの変数に割り当てようとしました
int a = null
しかし、それは私に以下の例外を与えています
org.codehaus.groovy.runtime.typehandling.GroovyCastException:クラス「null」のオブジェクト「null」をクラス「int」にキャストできません。 Script1.run(Script1.groovy:2)で代わりに「Java.lang.Integer」を試してください
次に、タイプが整数の変数にnull値を割り当てようとしました
Integer a = null
そしてそれはうまく機能しています。
groovy
がそのように動作する方法や、その背後にある理由を理解するのを誰かが助けてくれますか?
主要な問題は、 プリミティブ をnullにできないことです。 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
_
Groovyは、callプリミティブの場合、常にラッパータイプを使用します
int a = 100
assert Integer == a.class
groovyはintを受け取り、値を使用する前に整数にラップします。ただし、変数はint(プリミティブ型)であり、整数ではないため、groovyはint値をnullに設定できません。
int a = 100
int b = 200
a + b not int + int, but Integer + Integer
私が理解しているように、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
を与えます。
これはあなたがあなたの場合に見るものです