- ベストアンサー
byteについて
public static void hoge(byte b) { } public static void main (String args[]) { hoge(1); } とするとエラーになります。 でも、 public static void hoge(byte b) { } public static void main (String args[]) { byte b=1; hoge(b); } にするとエラーになりません。 なぜなんでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
エラーになる理由は、他の方々の回答のとおりです。 Javaでは接尾子の無い整数リテラルはint型と解釈されます。 このため、byte型で宣言された引数にint型の値を指定したという事でコンパイルエラーとなります。 (ダウンキャストは省略できません。) 「byte b = 1;」がエラーとならない理由ですが、byte型変数への代入で右辺に整数リテラルが指定された場合、 暗黙的にbyte型にキャストされてから代入されます。つまり「byte b = (byte)1;」と同じ動作になります。 ただし、整数がbyte型の範囲に収まらない場合はエラーになります。 (この辺の話はshort型でも同様です。) >キャスト以外に、byteとして認識させる方法があるのでしょうか? >longでLをつけるみたいに。 たぶん無いと思います。
その他の回答 (4)
Javaでは、整数リテラルはすべてint値として扱われます。したがって、 hoge(1); は、引数にint値を指定したことになり、エラーとなります。明示的キャストをして、 hoge((byte)1); ならばエラーにはなりません。 byte b=1; hoge(b); これがエラーにならなかったのは、引数に指定したのがbyte型変数だからです。一度byte型変数に値を入れれば、byteとして扱われますから問題は起こりません。
- kamkamkam3
- ベストアンサー率42% (216/514)
今、#2のお礼欄と手元にある独習Javaと独習Cをみたんですが、独習Cに「Cコンパイラは数値定数を、それを格納できる最小の大きさのデータ型に変換します。10はデフォルトでintになり、100003はlongになる。」と書いてあります。ならば、10はshortで良い様な気になってしまいます。基本は、int型ということなんだとおもいます。 その辺の仕組みは、JavaもCを基本としているので、同じだと思います。数値なら基本的にint型になるのがデフォルトなんではとおもいます。もちろん入りきらない値はlongとかになるんでしょうけど。。 その辺の言語の根本的な考えは独習Cに詳しく載っています。式内部での型変換などJavaと同じです。 Byte型の接尾子(long型のLみたいなもの)というのは聞いたことがないので、多分、キャストが一番の方法に僕は思います。 ただ、僕も素人に毛が生えた程度なので、あまり当てにしないでください。「Java long 接尾子」で、検索してもByte型の接尾子はでてこないので多分ないんでしょう。。
- kamkamkam3
- ベストアンサー率42% (216/514)
私も以下のコードでやってみました。 public class ByteTestXX { public static void hoge(Byte b){ } public static void main(String args[]) { hoge(1); } } エラーは↓ですね。 ByteTestXX.java:9: hoge(java.lang.Byte) (ByteTestXX 内) を (int) に適用できません hoge(1); ^ エラー 1 個 とエラーがでました。要するにコンパイラはhoge(Byte b)、int型変数は適用できません。といっているんじゃないでしょうか。 ということは、mainメソッド内で引数に「1」と与えるとそれ自体がint型として認識されてしまうみたいですね。 多分、そんな感じだとおもいますが。。
- fortranxp
- ベストアンサー率26% (181/684)
推測ですけども hoge(1); の1の型はなんなのでしょう。 intかDoubleなのかbyteなのか きっとJVM内でも解決できないのでは?
お礼
ありがとうございます。 それは分かるんですが、 変数で宣言した場合は、byteとして認識してるのに、 なぜメソッドに直接指定したときは認識してくれないのでしょう? もちろん、キャストすればできます。 hoge( (byte)1 ); キャスト以外に、byteとして認識させる方法があるのでしょうか? longでLをつけるみたいに。