web-dev-qa-db-ja.com

groovyのint型と整数型の違い

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がそのように動作する方法や、その背後にある理由を理解するのを誰かが助けてくれますか?

6

主要な問題は、 プリミティブ を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
_
5
Saurabh Gaur

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
4
Evgeny Smirnov

私が理解しているように、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を与えます。

これはあなたがあなたの場合に見るものです

1
injecteer