- PR -

キャストについて

投稿者投稿内容
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-30 15:31
>以下のコードは9行目でClassCastExceptionが発生します。
ん、コンパイルエラーでは?
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-03-30 15:33
ぶさいくろうさん、Edossonさん、ありがとうございます。

引用:

ぶさいくろうさんの書き込み (2006-03-30 14:34) より:
引用:
これで分かったように思えたのですが、以下のテストを行ってまた分からなくなりました。
Object obj = new String(); //<--(1)
Object obj2 = new Object(); //<--(2)
obj = new String("文字1"); //<--(3)
obj2 = new String("文字2"); //<--(4)
String str = (String)obj; //<--(5)
String str2 = (String)obj2; //<--(6)
何故か今度は、(6)もOKとなります。


4の時点でobj2はStringになってるだろ。(格納してる方じゃなく実体の方)
つまり、Object obj2 = new String("文字2");と結果同じなんだよ。

新たなインスタンスを参照するように変えてるんだからさ。
最初のじゃんぬねっと氏のヒントがまったく無駄になってるな。
引用:
Object[] obj = new Object[3]; //<--(1)
obj[0] = new String("文字1"); //<--(2)
obj[1] = new String("文字2"); //<--(3)
obj[2] = null; //<--(4)
String[] str = new String[3]; //<--(5)
str[0] = (String)obj[0]; //<--(6)
str[1] = (String)obj[1]; //<--(7)
str[2] = (String)obj[2]; //<--(
String[] str2 = (String)obj; //<--(9)
(6)(7)(はOKなのに(9)ではやはりClassCastExceptionとなります。


こっちは当初の投稿となんら変わりないので『なぜか9ではこうなります』といわれてもね・・・


始めの例の(4)でやっているのと、配列の例の(2)(3)でやっているのは同じ事では
ないのでしょうか?
(4)new String("xxx")とすると、objは全てString型の値を持つ参照変数となりますよね。
なので(9)ができると思っているのですが・・・。
(obj instanceof String[])はtrueとなっていますし。

引用:

もうひとつ行きましょうか。
以下のコードは9行目でClassCastExceptionが発生します。
その理由を考えてみてください。
コード:
1 : String temp = new String();
2 : 
3 : String hoge1 = null;
4 : Object hoge2 = null;
5 : String hoge3 = null;
6 : 
7 : hoge1 = temp;
8 : hoge2 = hoge1;
9 : hoge3 = hoge2;




7はStringにStringを入れているので問題ない。
8はObjectにStringを入れているので問題ない。(アップキャスト)
9はStringにObjectを入れようとしているので、実際のデータ型(String)で
ダウンキャストしなければならない。→ hoge3 = (String)hoge2;
という事でしょうか。

この考え方を先程の例に当てはめると、
引用:

コード:
1 : Object[] obj = new Object[3];
2 : 
3 : obj[0] = new String("文字1"); 
4 : obj[1] = new String("文字2"); 
5 : obj[2] = new String("文字3");
6 : 
7 : String[] str = new String[3];
8 : 
9 : str[0] = (String)obj[0];
10: str[1] = (String)obj[1];
11: str[2] = (String)obj[2]; 
12: 
13: String[] str2 = (String)obj;




3,4,5でObjectにStringを入れている。
13は例題の9と同じで、String[]にObject[]を入れようとしているので実際の
データ型(String[])でダウンキャストしなければならない、
と思うのですが。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-03-30 15:38
引用:
OZさんの書き込み (2006-03-30 15:33) より:
始めの例の(4)でやっているのと、配列の例の(2)(3)でやっているのは同じ事では
ないのでしょうか?
(4)new String("xxx")とすると、objは全てString型の値を持つ参照変数となりますよね。


どうやら、箱(変数宣言)と中身(インスタンス生成)以外にも、配列そのものと配列の中身を同一視しているらしい・・・
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-03-30 15:41
orz
お目汚し、失礼しました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-30 16:08
> orz
慣れてても一瞬勘違いすることがあるので、じゃんじゃんコンパイル・実行して慣れていこうってことですよね!
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-03-30 16:36
さて性懲りもなく(^ ^;
引用:

OZさんの書き込み (2006-03-30 15:33) より:

obj instanceof String[])はtrueとなっていますし。


本当に?

引用:

インギさんの書き込み (2006-03-30 16:08) より:

慣れてても一瞬勘違いすることがあるので、じゃんじゃんコンパイル・実行して慣れていこうってことですよね!


ありがとうございます。(というふうにとっちゃっていいんですかね)
というわけで、こういうのは自分で叩いて身につけるのが、一番速いですよ。
コード:

Object[] obj = null;
String[] str = null;

obj = new String[3];
obj[0] = new String();
obj[1] = new String();
obj[2] = new String();
System.out.println("obj is instance of String[] : " + (obj instanceof String[]));
str = (String[])obj;// <-- さて、ここではClassCastExceptionは発生する?

obj = new Object[3];
obj[0] = new String();
obj[1] = new String();
obj[2] = new String();
System.out.println("obj is instance of String[] : " + (obj instanceof String[]));
str = (String[])obj;


今回は、実際に走らせてみました。m(_ _)m

[ メッセージ編集済み 編集者: Edosson 編集日時 2006-03-30 16:38 ]
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-03-30 16:43
回答例だけ書いてみると…

Object[] objArray = new Object[3];
objArray[0] = "foo";
objArray[1] = "bar";
objArray[2] = null;

//これはダメ
//String[] strArray0 = (String[])objArray;

//方法a
String[] strArray1 = (String[])Arrays.asList(objArray).toArray(new String[0]);

//方法b
String[] strArray2 = new String[objArray.length];
System.arraycopy(objArray, 0, strArray2, 0, objArray.length);
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-03-30 16:50
こんなに長引くような話題なんかな・・・

System.arraycopyの場合どんな展開をするのかを理解してないと結局
『なんでそうしないとダメなんですか』になりそ・・・

で答えは書いてあっても頭の中で展開できないと・・・

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