- PR -

型変換について

投稿者投稿内容
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 17:51
こんばんわ。
いつもお世話になっております。
型変換について、ご教授願います。m(_ _)m
ひとつの関連するデータのグループがあるのですが、
そのデータ群は色々なデータ型(String、int、Long、Booleanなど)
で存在しています。
そのデータグループを1つのデータグループとして配列に
格納して、まとめて持っておきたいのですが、
例えば、Object配列に値を格納しようとすると、
intやLongでは、キャストが出来ないため、格納することができません。
全ての親クラスであるObjectなら、型が違っても値を
格納できる(キャストできる)と思っていたのですが・・・。
なぜ、キャストできないのでしょうか・・・。
そして、なぜStringだけキャストできるのでしょうか。
基礎的なことで申し訳ありませんが、
どなたか、ご教授いただけないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-15 18:04
コレクションじゃダメなんですかね?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-11-15 18:05
オブジェクトラッパー型にキャストすればいいはず
tigerからは暗黙キャストされますが


OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp

[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2005-11-15 18:11 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-11-15 18:08
引用:

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

例えば、Object配列に値を格納しようとすると、
intやLongでは、キャストが出来ないため、格納することができません。


intは不可能ですが、Longだったらキャスト可能ですよね。
longだったら、intと同様、不可能です。
引用:

全ての親クラスであるObjectなら、型が違っても値を
格納できる(キャストできる)と思っていたのですが・・・。
なぜ、キャストできないのでしょうか・・・。
そして、なぜStringだけキャストできるのでしょうか。


結論を言ってしまうと、数値リテラルはオブジェクトではないからです。
Wrapperクラスでラップすると、可能になります。
intとIntegr、longとLongの違い、「Wrapprerクラス」などを調べてみてください。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-15 18:19
こんばんは。

引用:

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

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




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

JDK5では、「オートボクシング・アンボクシング」機能があるので、
そういうキャストの問題は解消されるでしょう。
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 18:41
引用:

じゃんぬねっとさんの書き込み (2005-11-15 18:04) より:
コレクションじゃダメなんですかね?





じゃんぬねっとさん、ご返信ありがとうございました。
java.util系の配列オブジェクトへの代入も考えたのですが、
putやaddで代入する型がObject型なので、
結果的に、object配列に代入するのと同じになってしまいました。
・・・もしかして、根本的に間違っていますでしょうか・・・。
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 18:42
引用:

明智重蔵さんの書き込み (2005-11-15 18:05) より:
オブジェクトラッパー型にキャストすればいいはず
tigerからは暗黙キャストされますが


OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp

[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2005-11-15 18:11 ]



明智重蔵さん、ご返信ありがとうございました。
明智さんがおっしゃっているのは、
↓のようなことでしょうか?
Object[] test = null;

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

test[0] = s;
test[1] = (Integer) i;
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-11-15 18:45
引用:

Edossonさんの書き込み (2005-11-15 18:08) より:
引用:

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

例えば、Object配列に値を格納しようとすると、
intやLongでは、キャストが出来ないため、格納することができません。


intは不可能ですが、Longだったらキャスト可能ですよね。
longだったら、intと同様、不可能です。
引用:

全ての親クラスであるObjectなら、型が違っても値を
格納できる(キャストできる)と思っていたのですが・・・。
なぜ、キャストできないのでしょうか・・・。
そして、なぜStringだけキャストできるのでしょうか。


結論を言ってしまうと、数値リテラルはオブジェクトではないからです。
Wrapperクラスでラップすると、可能になります。
intとIntegr、longとLongの違い、「Wrapprerクラス」などを調べてみてください。



Edossonさんご返信ありがとうございます。
int i = null;
Integer in = null;
とeclipseで記述してみたところ、
int i = null;
はエラーになりました。
プリミティブ型が数値でもオブジェクト扱いしているからですよね。
しかし、明智重蔵さんへの返信に書きましたとおり、
プリミティブ型にキャストすると、コンパイルエラーになってしまうのです・・・。

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