- PR -

AutoBoxingで混乱してます。

1
投稿者投稿内容
Nana
会議室デビュー日: 2008/07/07
投稿数: 10
投稿日時: 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という流れは
存在しないのでしょうか?
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2008-11-08 00:52
AutoBoxingはプリミティブ型をラッパークラスに自動でラップするだけの機能です。

floatのラッパーはFloatでありDoubleでは無い為Bはエラーとなります。
例2に関しても同様です。

@は"プリミティブ型の拡大変換"により、ご想像された動作と(ほぼ)同様の
動作をします。

"プリミティブ型の拡大変換"はAutoBoxingには適用されない為この様な
動作となります。
Nana
会議室デビュー日: 2008/07/07
投稿数: 10
投稿日時: 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型に代入できない。
というような解釈で問題ないでしょうか?
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2008-11-11 23:08
引用:
例えば上記の場合、@ではunAutoBoxing?が働いてshort型、byte型に
変換され、演算のため更にint型に変換され演算結果がAutoBoxingで
Integer型の変数iに代入されるけど
Aの場合は、演算結果のint型ラッパクラスはIntegerであるため
Long型に代入できない。


その解釈で良いと思います。
#演算が評価される順序までちゃんと把握されているようなので、失礼ですが
#ちょっと驚きましたw
1

スキルアップ/キャリアアップ(JOB@IT)