• ベストアンサー

Java intの扱い

こんにちは、Javaを勉強しているものです。 小さなデータ(byteなど)をより大きないれもの(intなど)に入れるときには、暗黙的なキャストがおこなわれます。 逆に、大きな値を小さないれものに入れるための変換を「縮小変換」と呼び、これには明示的なキャストが必要だと習いました。 そこで、次のようなコードがあった場合、これは明示的なキャストが必要なのではないのでしょうか? byte b = 3; これは、コンパイルエラーにはならないのですが、 3はint型であり、bはbyte型なので、大きな値を小さな小さないれものに入れているということになります。本来であれば byte b = (byte)3; と書くべきではないのでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.4

No2です。こちらこそ遅くなりましてすみません。 遅くなりましたが、補足への回答をさせていただきます。 >int型以外でもリテラル値であれば、どのようなものでも自動的に型変換されるのでしょうか? 大きい型の変数に小さい型のリテラル値を代入する場合は 既にご指摘の通り、そのまま代入可能です。 double e = 3.5F; リテラル値はデフォルトは「整数ならint」、「小数ならdouble」のようです。 明示的にintやdouble以外を指定した場合、 //int i = 3F; のような指定はできないようです。 その他にもいろいろあるようですが、これ以上のことを言うとボロが出そうなので、 代わりに参考ページを挙げておきます。 言い訳させてもらうと、このような問題は、現場(実際のコーディングをする場合)は、 あまり問題にはならないはずです。 というより、「問題にしてはいけない」ことだと思います。 書いたコードがintか、shortかということより、本来達成すべきロジックがあるだろう、 という意味です。 byte b = 3;か、byte b = (byte)3;であるかは、 事前にコーディング規約として決定してあるものに従うべきなんでしょう。 話がそれてしまった… まあ、知っておいて損するものではないでしょうし、いずれ新人さんが 「なんでこれがエラーになるんですか?」と言われた時に、 サラッと答えられるように覚えておくのも良いですね。

参考URL:
http://www.okapiproject.com/java/java_ref/foundation/manual_02.htm
geocrew1
質問者

お礼

解りやすい説明ありがとうございます。 このようなことにこだわるのは、私がSJC-P試験の勉強をしているからなのです。いろいろと参考紹介などもあげて頂いて本当に助かりました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

代入変換の例外として、特別に認められています。 「Java言語規定 5.2 代入変換」 http://www.y-adagio.com/public/standards/tr_javalang/5.doc.htm#170768 >次の条件をすべて満足すれば,プリミティブ型の縮小変換を使用してもよい。 > * 式が型byte,short,char又は,intの定数式。 > * 変数の型が,byte,short又はchar。 > * 式の値(定数式なのでコンパイル時にわかる)が,その変数の型で表現可能 初期化時に byte b = (byte)3; と書くのは面倒だし、上の条件を満たしている場合には 問題になることはあまり考えられないので、認めることにしたのでしょう。

geocrew1
質問者

お礼

お返事が遅くなり申し訳ございません。 詳しいご説明ありがとうございます。 >式が型byte,short,char又は,intの定数式。 これは=より右辺のこと > * 変数の型が,byte,short又はchar これは=より左辺のこと という理解で正しいでしょうか?

すると、全ての回答が全文表示されます。
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

>逆に、大きな値を小さないれものに入れるための変換を「縮小変換」と呼び、これには >明示的なキャストが必要だと習いました。 これは正しいです。 ただし、byteやshortにリテラル値を代入する場合は、ちょっと特殊なようです。 byteやshortにリテラルの値を代入する場合、代入する変数の型に合わせて自動的に型変換されるようです。  byte b = 3;  //(1)リテラルなら自動的に型変換されるので代入可能  int i = 3;  //b = i;  //(2)リテラルでない場合はだめ。  //b = 128;  //(3)リテラルでもbyteの範囲を超えるものは自動変換できずエラーになる。 (1)と(2)は同じ値を代入してるように見えますが、 (1)リテラル値3がbyteに変換されるため代入可能です。 (2)は、リテラルでないため、自動変換されず代入できません。 ちなみに、リテラルであってもその型のデータ範囲を超える値は代入できません。 なので、(3)は代入不可です

参考URL:
http://www.nextindex.net/java/literal.html
geocrew1
質問者

お礼

お返事が遅くなり申し訳ございません。 解りやすい説明、ありがとうございます。 リテラル値の場合は、自動的に型変換されるというのは存じておりませんでした。int型以外でもリテラル値であれば、どのようなものでも自動的に型変換されるのでしょうか?

すると、全ての回答が全文表示されます。
  • kgi03334
  • ベストアンサー率26% (24/90)
回答No.1

byte b = (byte)3; と書くべきです。

参考URL:
http://javafaq.jp/S007.html
geocrew1
質問者

お礼

お返事ありがとうございます。 書くべきというのは、分かりますが、 byte b = (byte)3; は、コンパイルエラーにはなりませんよね? 例えば、short型にdouble型を入れようとすると明示的なキャストがなければコンパイルエラーになります。 今回のケースだけコンパイルエラーにならない理由は何でしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A