2

Java での私の知識によると、型変換を絞り込む際に、ソースがバイトの範囲内にある定数の場合、次のものが許可されます。

byte b=10; // allowed because 10 is in range of byte and 10 is a constant

しかし、これを入力すると:

byte b=10l; // this is not allowed although 10 is in range of byte and is a constant 

なんでそうなの ?これらの縮小変換が Java で行われる正確な規則を教えてください。

4

5 に答える 5

3

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2 :

さらに、式がbyte、short、char、または int型の定数式 (§15.28) である場合:

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

long 型の定数式があり、その場合、縮小プリミティブ変換を適用できません。

したがって、次のことができます。

  • byte b = 10
  • byte b = (int) 10
  • char b = (short) 10
  • byte b = (char) 10L
  • short b = (int) 10L

しかし、あなたはできません:

  • byte b = 10L
  • byte b = (long) 10
于 2014-05-30T07:28:50.183 に答える
2

技術的な答えは — 仕様がそう言っているからです。Java 言語仕様、Java SE 8 Editionの§5.2「Assignment Contexts」には、次のように記載されています。

さらに、[代入文の右側の] 式byteが 、shortchar、または型の定数式 (§15.28) である場合int:

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

定数式が type であることを許可しない理由については、long「偶然に」 type になってしまうことがないからだと思いますlongbyte b = 127を省略形として記述できるのは非常に便利ですが、コンパイラが;の省略形としてbyte b = (byte) 127誤って記述することを防ぎます。具体的には、なぜそれが必要なのですか?byte b = 128byte b = (byte) 128byte b = 127L

于 2014-05-30T07:33:12.463 に答える
1

あなたが値に付けたものはコンパイラに明示的に伝えるからlです-「仲間を聞いてください。ここに「長い」フィールドがあります。「長い」フィールドに必要なスペースを与えてください。

明らかに、長い値はバイト フィールドに収まりません。したがって、エラーが発生します-Cannot Convert from Long to Byte

于 2014-05-30T07:23:00.620 に答える
0

Java は厳密に型指定された言語です。小さい型から大きい型への型変換を暗黙的に処理しますが、大きい型から小さい型への型変換の場合は、型キャストによって明示的に行う必要があります。

たとえば、long は int を収容できますが、int は long を収容するのに十分なスペースを確保できないため、コンパイラが警告します。

したがって、あなたの場合、次のことができます:

byte b= (byte) 10l;

お役に立てれば

于 2014-05-30T07:25:47.643 に答える
0

そうです、10はバイトの範囲です。しかし、l定数にサフィックスを使用すると、Java はこの定数が であることを認識しlongます。longに収まらないためbyte、エラーが発生します: javac.

ただし、からへbyte b = (byte) 10l;のストレート キャストであるため、機能します。longbyte

于 2014-05-30T07:26:34.317 に答える