2017-04-13 1 views
7
short s = 'a';  // valid 
Short ss = 'a';  // valid 
int i = 'a';   // valid 
Integer ii = 'a'; // invalid 

なぜInteger ii = 'a'が無効ですが、int i = 'a'が有効ですか?なぜ、短いss = 'a'は有効ですが、整数ii = 'a'は無効ですか?Javaの奇妙な割り当てルール


別の組の質問:

byte b; 
final short s = 1; 
final Short ss = 1; 
final int i =1; 
final Integer ii = i; 
final long L = 1; 
final Long LL =1L; 

b = s;  // valid 
b = ss; // invalid 
b = i;  // valid 
b = ii; // invalid 
b = L;  // invalid 
b = LL; // invalid 

なぜB = L。無効ですが、b = sです。有効ですか?

JLSがそう言っているので、それはすべてではありません。 JLSがこれらの一貫性のない非直感的なルールを持つ理由を知りたい。私は何を取りこぼしたか?

+6

ので、オートボクシング(およびプリミティブ拡大変換)は、 'char'を' Integer'にするためには機能しません。 'Integer ii =(int) 'a'を試してください。 ' –

+0

iiはクラスのインスタンスですが、iは整数のデータ型のインスタンスです。 – Omore

+1

javaの「Autoboxing and Unboxing」について学ぶ良い時間です。 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – yogidilip

答えて

5

したがって、ライン:

Short s = 'a'; // is valid ... 

チャーが符号なし16ビットの値(最大値は65,536である)と短いあるので、16ビットの値(最大値は32,767である)で署名され、そのため、ボクシングの変換(ShortからShort)に続いて、狭い原始的な変換(short to char)があります。

short s = 'a'; // is valid - this is a narrowing primitive conversion (char -> short) 

これらはspecial casesある:また

、発現は タイプバイト短いチャー、又はINTの定数式である場合:

  • 狭義のプリミ 変数の型は変数の型で表現可能であるバイト短い、又はチャー、及び定数 式の値である場合TIVE変換が使用されてもよいです。

    • バイトと定数式の値が 型で表現可能である:変数の型である場合ボクシング変換続い狭くプリミティブ変換を 使用することができる

    バイト

  • ショートと定数式の値が短い 型で表現可能です。

  • 文字と定数式の値が タイプチャー表現可能です。

のは、次の例に行こう:

Integer ii = 'a'; // is invalid - not a special case according to Oracle docs 
int i = 'a';  // is valid - widening primitive conversion (char -> int) is allowed 

そして、あなたの質問から1以上の場合:

byte b; 
final long L = 1; 
b = L // error - incompatible types 

ラインB = Lが無効であるのはなぜ?それは、上記の特別な場合ではないと私たちはキャスト時に情報が失われる可能性があるため、明示的にそれを実行しなければならない理由です:

また
b = (byte) L; // is valid - narrowing primitive conversion (long -> byte) 

を、非常に参考にtableに顔をしています。

これらのルールに関する多くの情報がJLSドキュメントにあり、それらのすべてについて心配する必要はありません。私はあなたの最後の質問について何を言うことができ、暗黙の縮小変換することなく、リテラルの任意の整数は、次の例では、キャストが必要となることをされています。それに

// Cast is permitted, but not required - profit! 
byte b = (byte) 100; 
short s = (short) 100; 

おかげで、我々はそれを変更することができます。

byte b = 100; 
short s = 100; 
+0

詳細なお返事ありがとうございます。私はあなたの説明を理解しています。 JLSがそう言ったからです。しかし、なぜJLSはこの奇妙なルールを持っていますか?規則は一貫していません。例えば;式がbyte型、short型、char型、またはint型の定数式である場合にのみ、縮小されたプリミティブが発生します。そんなに長くない?長い間何が間違っていますか? –

+0

@VincentQuan狭いプリミティブ変換は、最大のプリミティブ整数型であるため、 'long'には意味がありません。 – Hulk

関連する問題