JAVAについて質問です。Object型にString型をセットしReturnするコーディングがあったのでそれを参考にし、以下のようなコーディングを作成しました。

Object 関数名(int iCase){
   Object[] oReturnValue=new Object[2];
   oReturnValue[0]=intの変数;
   oReturnValue[1]=CStringの変数;
   return oReturnValue[iCase];   
}
int iTest=(int)関数名(0);

オブジェクトにStringが入るんだからintも設定できるだろう
とかんがえました。この関数内一応コーディングの段階でエラー表示にはならなかったのですが、
呼び出しているほうでエラー表示になってしまいます。
なぜでしょうか?アドバイスいただきたくよろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/11/07 20:16:45
  • 終了:2008/11/12 09:06:41

ベストアンサー

id:quintia No.4

quintia回答回数559ベストアンサー獲得回数682008/11/08 14:23:47

ポイント200pt

エラーになる理由はすでにある回答の通りでいいと思いますが……


oReturnValue[0]=intの変数;

の部分で、これをコンパイラに、

oReturnValue[0]=new Integer(intの変数);

と解釈させるのはさほど難しいことではないです。(すでに出ているとおり autoboxing と呼びます)


しかし、

Object o;

(略)

int a = o;

となった時に最後の行を、

int a = ((Integer)o).intValue();

とコンパイラが自動で変換してよいか? という判断で、言語設計としてこれはまずいだろう、となったのでしょう。

つまり、

自動的な処理として「プログラマの意図を超えた」動作ではないか。

別の意図で書かれた(つまりバグが入り込んでいる)ソースであるケースの方が可能性が高いのではないか。

だとしたらコンパイルでエラーとするべきではないか。

と判断されたのだと思います。


これが、

Integer o;

(略)

int a = o;

であれば、まぁいいだろう、とする(o.intValue() と解釈してコンパイルする)のが auto-unboxing の考え方ですね。


ご質問のソースであれば、

int iTest=(Integer)関数名(0);

と書いてやると auto-unboxing が利いて

int iTest=((Integer)関数名(0)).intValue();

の様にコンパイルされるでしょう。

しかし明にキャストしなければならないぐらいであれば、auto-unboxing に頼らない様なソースコードにするべきだと感じます。(auto-unboxing する/しないの線引きも、その辺にあると考えます。)


ダミーURL

http://www.theserverside.com/news/thread.tss?thread_id=24477

その他の回答(3件)

id:tomo_k No.1

tomo_k回答回数426ベストアンサー獲得回数262008/11/07 21:22:44

ポイント100pt

intはオブジェクトではないからです。

プリミティブ型であるのでObjectには入れられません。

Javaのすべてのオブジェクトはjava.lang.Objectというクラスを継承しているからあらゆるオブジェクトを代入できるのであって、オブジェクトですらないintをだいにゅうすることは不可能です。

もし、Objectに入れたければIntegerというクラスを使うとよいでしょう。ただし、普通に数値計算するにはintに戻さなければならないなど扱いが面倒だと思います。

http://www.itarchitect.jp/beginners/-/26001.html

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/11/07 22:03:57

ポイント100pt

オブジェクトにStringが入るんだからintも設定できるだろう

昔からの Java2 では String は Object を継承したクラスですが、

int は組み込み型です。Object の配列に代入することは出来ません。


実行環境が J2SE 1.5 以降なら、autoboxing と言う機能で

自動的に Integer に変換されますので実行は出来ますが、あくまで int が

入っているわけではありません。

【コラム】ライトニングJava (2) Autoboxing/Unboxing(1) - プリミティブ型をコレクションフレームワークで | エンタープライズ | マイコミジャーナル

id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402008/11/08 01:23:48

ポイント50pt

intはオブジェクトではないのです。だから、Integerとかに変換して格納するのが普通です。

http://q.hatena.ne.jp/answer

id:quintia No.4

quintia回答回数559ベストアンサー獲得回数682008/11/08 14:23:47ここでベストアンサー

ポイント200pt

エラーになる理由はすでにある回答の通りでいいと思いますが……


oReturnValue[0]=intの変数;

の部分で、これをコンパイラに、

oReturnValue[0]=new Integer(intの変数);

と解釈させるのはさほど難しいことではないです。(すでに出ているとおり autoboxing と呼びます)


しかし、

Object o;

(略)

int a = o;

となった時に最後の行を、

int a = ((Integer)o).intValue();

とコンパイラが自動で変換してよいか? という判断で、言語設計としてこれはまずいだろう、となったのでしょう。

つまり、

自動的な処理として「プログラマの意図を超えた」動作ではないか。

別の意図で書かれた(つまりバグが入り込んでいる)ソースであるケースの方が可能性が高いのではないか。

だとしたらコンパイルでエラーとするべきではないか。

と判断されたのだと思います。


これが、

Integer o;

(略)

int a = o;

であれば、まぁいいだろう、とする(o.intValue() と解釈してコンパイルする)のが auto-unboxing の考え方ですね。


ご質問のソースであれば、

int iTest=(Integer)関数名(0);

と書いてやると auto-unboxing が利いて

int iTest=((Integer)関数名(0)).intValue();

の様にコンパイルされるでしょう。

しかし明にキャストしなければならないぐらいであれば、auto-unboxing に頼らない様なソースコードにするべきだと感じます。(auto-unboxing する/しないの線引きも、その辺にあると考えます。)


ダミーURL

http://www.theserverside.com/news/thread.tss?thread_id=24477

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません