2013-12-17 13 views
20
Long ll = 102; // Error 
Byte bb = 101; // No error 

int型?Javaのプリミティブ割り当てコンテキストロングでの変換と<code>Byte</code>割り当てが細かいながら<code>Long</code>割り当ては、コンパイル時にエラーが生じているのはなぜ

Long ll = 102は、コンパイラエラー "型の不一致:intからLongに変換できません"が発生します。コンパイラは102からlongまで広がり、その後Longになると仮定しました。 しかし、それは起こっていません。

ただし、Byte bb = 101;はコンパイルエラーを生成していません。ここでは、101はbyte(非長整数定数)に絞り込まれ、次にボックス化されてByteになります。 ナローイングに問題がない場合、拡大する際の問題は何ですか?

+0

ところで 'ロングLL = 102Lを動作しません;' – janos

+1

感謝を働くだろう。私はコンパイラエラーを避けるためにコードを変更することに気付いていますが、コンパイラの動作を理解したいと思います。 – Lalith

+0

BTWプリミティブを使用できる場合、オブジェクト/ラッパーは使用しないでください。これらは単純で高速です。 –

答えて

11

pはint型の値である場合は、変換をボクシングは、クラスの基準にR Pを変換し、整数、その​​結果Rを入力5.1.7 Boxing Conversion of the JLS

  • を参照してください。intValue()== P

102が整数リテラルであるので、それはタイプがintで、(スペックが言うように)自動ボクシングはIntegerに変換しますが、IntegerLongにキャストすることはできないのです。

は、このようにあなたはlongリテラルを使用するか、intリテラルlongにJLSはボクシング変換を使用するキャスト、結果はLongオブジェクトになりますとき。

これは微細になりなぜならまた5.2. Assignment Conversion

Long long1 = (long) 102; 
Long long2 = 102L; 
Long long3 = 102l; 

第1

Byte bb = 101; 

作品、式は定数式である場合(15.28バイト、ショート、char、またはintの型):

  • 変数の型がbyte、shortまたはcharの場合は、縮小プリミティブ変換を使用でき、定数式の値は変数の型で表現できます。

そこで101は整数リテラルであるが、縮小変換必要の割り当てがある - byte値の範囲内である(整数>バイト)とintの値。したがって、変数型(spec参照)として表現でき、変換されます。

これはもちろんの

Byte bb = 128; // can not be represented as the variable type. Thus no narrowing conversion. 
+0

オートボクシングはそれをIntegerに変換しますが(仕様によると)、IntegerはLongにキャストできません。それではIntegerをバイトにどのように割り当てることができますか?(バイトbb = 101は正常に動作していますか? – Lalith

+0

@ user3110711私は自分の答えを更新しました。今はっきりしていることを願っています。 –

+0

説得力がありません。バイトbb = 128;範囲外の値のために機能しません。しかし、範囲内の値が与えられると、狭化は機能しますが、広がりは機能しません。その理由は何か。 – Lalith

12

これはlongではなくLongを使用しているために発生しています。 Javaオートボクシングは、同じステップでintからlongに変換され、次にautobox longからLongに変換されません。

コードをlong llに変更すると動作します。

byteプリミティブのJavaにはマーカーはありません - byte(-128~ + 127)の有効範囲内で入力された値は、文脈に応じてbyte又はintegerのいずれかとして処理することができます。この場合は、それをbyteとして処理し、自動ボクシングを処理することができます。

私はJavaの仕組みをこのようにした理由についてはわかりません。バイト処理は、他のすべての数値型と矛盾しているようです。

+0

ありがとうございます。しかし、なぜバイト割り当てがエラーにならないのですか? – Lalith

+0

これをカバーする編集を追加しました。 –

+0

ありがとうございます。これは論理的に見えます。したがって、ボクシングリテラルはターゲットタイプに基づいて解釈されます。 – Lalith

6
  1. オートボクシングがありませんキャスト;例えば、それはLonglongIntegerintなどJavaの数値リテラルで
  2. が、それは明確にする必要があり、本質的にそうint

のみオートボックスありますなぜLongへの割り当てはしません仕事:intlongにキャストしようとしていて、次に1つのステップでLongに自動ボックスされています。それはByte作品になぜ割り当てですので

しかし、範囲内の数値リテラルは、127-128は、右の文脈でbyteリテラルとして解釈することができます。

+0

ありがとうございます。これは論理的に見えます。したがって、ボクシングリテラルはターゲットタイプに基づいて解釈されます。 – Lalith

関連する問題