- 山本 裕介
- ぬし
- 会議室デビュー日: 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の場合どんな展開をするのかを理解してないと結局
『なんでそうしないとダメなんですか』になりそ・・・
で答えは書いてあっても頭の中で展開できないと・・・
|