- - PR -
AutoBoxingで混乱してます。
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-11-07 23:00
現在、SJC-Pを受験するために勉強中です。
AutoBoxingの機能する箇所がいまいち理解できないため 参考になるサイト等ありましたらご教授下さい。 例1: float f = 3.5f; @Double d1 = new Double(f); ADouble d2 = (double)f; BDouble d3 = f; //コンパイルエラー @はAutoBoxingが働いてDouble((double)f)となっている というのは想像できるのですが、BはどうしてAutoBoxing が働かないのでしょうか? また、少し観点が異なってしまうのですが、何故以下の 場合、暗黙型変換はおこなってくれないのでしょうか? 例2: public static void main(String args[]){ byte f1 = 3; test(f1); //コンパイルエラー } static void test(Integer f){ //(int f)ならOK System.out.println("Float" + f); } ※そもそも暗黙型変換>AutoBoxingという流れは 存在しないのでしょうか? | ||||
|
投稿日時: 2008-11-08 00:52
AutoBoxingはプリミティブ型をラッパークラスに自動でラップするだけの機能です。
floatのラッパーはFloatでありDoubleでは無い為Bはエラーとなります。 例2に関しても同様です。 @は"プリミティブ型の拡大変換"により、ご想像された動作と(ほぼ)同様の 動作をします。 "プリミティブ型の拡大変換"はAutoBoxingには適用されない為この様な 動作となります。 | ||||
|
投稿日時: 2008-11-08 01:11
SUK2さん。ご返答ありがとうございます。
SUK2さんのおっしゃる通り、拡大変換とAutoBoxingを分けて考えれば なんとなく理解できたような気がします。 @Integer i = new Short((short)3) + new Byte((byte)2); ALong l = new Short((short)3) + new Byte((byte)2); 例えば上記の場合、@ではunAutoBoxing?が働いてshort型、byte型に 変換され、演算のため更にint型に変換され演算結果がAutoBoxingで Integer型の変数iに代入されるけど Aの場合は、演算結果のint型ラッパクラスはIntegerであるため Long型に代入できない。 というような解釈で問題ないでしょうか? | ||||
|
投稿日時: 2008-11-11 23:08
その解釈で良いと思います。 #演算が評価される順序までちゃんと把握されているようなので、失礼ですが #ちょっと驚きましたw |
1