- PR -

型変換について

投稿者投稿内容
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 18:46
引用:

Tdnr_Symさんの書き込み (2005-11-15 18:19) より:
こんばんは。

引用:

SUNNYDAYさんの書き込み (2005-11-15 17:51) より:

型変換について、ご教授願います。m(_ _)m
ひとつの関連するデータのグループがあるのですが、
そのデータ群は色々なデータ型(String、int、Long、Booleanなど)
で存在しています。
そのデータグループを1つのデータグループとして配列に
格納して、まとめて持っておきたいのですが、
例えば、Object配列に値を格納しようとすると、
intやLongでは、キャストが出来ないため、格納することができません。
全ての親クラスであるObjectなら、型が違っても値を
格納できる(キャストできる)と思っていたのですが・・・。
なぜ、キャストできないのでしょうか・・・。
そして、なぜStringだけキャストできるのでしょうか。




とりあえず、プリミティブ型と参照型の区別をしましょう。

JDK5では、「オートボクシング・アンボクシング」機能があるので、
そういうキャストの問題は解消されるでしょう。




Tdnr_Symさんご返信ありがとうございました。
今回存在するデータ群は、全てプリミティブ型でした。
確認不足ですみませんでした。
ちなみに、JDKは1.4なので、ご教授いただいた、
「オートボクシング・アンボクシング」機能は使えないのです・・・。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-11-15 20:02
引用:

SUNNYDAYさんの書き込み (2005-11-15 18:42) より:

Object[] test = null;

String s = "aaa";
int i = 1;
long l = 2;

test[0] = s;
test[1] = (Integer) i;



ちょっと違います。

コード:
Object[] test = new Object[3]; // きちんと new で配列変数を初期化しないと NullPointerException が発生します

String s = "aaa";
int i = 1;
long l = 2;

test[0] = s; // これは OK
test[1] = new Integer(i); // キャストではなく、i を初期値とする Integer オブジェクトを生成する必要があります



ちなみに test[1] の値を int として取り出す時は、test[1] instanceof Integer が true となることを確認した上で ((Integer) test[1]).intValue() と書く必要があり面倒です。
最初の投稿で「ひとつの関連するデータのグループ」と書かれていますが、それらをまとめたクラスを設計するのが良いかもしれません。
少なくとも、配列の要素の型をいちいち調べてからでないとデータが取得できないのは、オブジェクト指向的ではありません。

もう一つの書き込みにも回答しますが、
コード:
int i = null;


は、i がプリミティブ型であるのに対し、null は Null 型という特殊な型です。
Null 型は任意の参照型に代入可能なので
コード:
String s = null;
Integer i2 = null;


という参照型変数の初期化に使えます。

一方で、Null 型はすべてのプリミティブ型に対して代入・キャスト不可能なので
コード:
int i = null; // 代入不可能
int j = (int) null; // 明示的にキャストすると、キャスト自体がエラー


などはコンパイルエラーです。
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 20:31
Gioさんご返信ありがとうございました。
例題まで載せてくださり、とても分かりやすかったです。
ありがとうございました。m(_ _)m
またご質問させていただく時もあると思いますが、
その時は、よろしくお願い致します。m(_ _)m

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