- - PR -
キャストについて
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-29 18:58
ObjectからStringへのキャストで、
Object[] obj = new Object[3]; obj[0] = new String("文字列1"); obj[1] = new String("文字列2"); obj[2] = null; String s1 = (String)obj[0]; String s2 = (String)obj[1]; String s3 = (String)obj[2]; だと上手く行くのですが、 String[] str = (String[])obj; <---実際にやりたい処理 ですとClassCastExceptionとなってしまいます。 元のObject変数には、Stringとして代入しているので上手く行くと思ったのですが。 ちなみにそう思った根拠は下記のURLを参考にしました。 http://www.javaroad.jp/bbs/answer.jsp?q_id=20050513145513872 初歩的な問題かもしれませんが、こういった処理はできないのでしょうか? できるとしたら何が原因なのかご教授下さい。 | ||||||||
|
投稿日時: 2006-03-29 19:47
理由を考える例。
ダウンキャスト・Clone コピーしているわけではない・メモリ領域の位置は変わらない・元の型との互換 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-03-29 20:41
じゃんぬねっとさん、ありがとうございます。
主にここを参考にしながら調べてみました。 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000107.html あまり良くない事をやろうとしている事が分かりました。 しかし、理由は分かりませんでした。 私が思っていたのは、 ============================================= Object[] obj = new Object[3]; //<--(1).Object型の参照変数作成 obj[0] = new String("文字列1"); //<--(2).(1)の変数にString型インスタンスの参照を設定 obj[1] = new String("文字列2"); obj[2] = null; String s1 = (String)obj[0]; //<--(3).obj[0]はObject型だが中身はString型インスタンスへの参照だから、 String s2 = (String)obj[1]; // String型へダウンキャスト可能 String s3 = (String)obj[2]; //(obj[1],obj[2]についても同様) ============================================= というものでした。 従って、配列を要素毎に行うのも一気に行うのも同じと思っていたのですが、 (1)を ============================================= Object[] obj = new String[3]; ============================================= に変更すると上手く行くという事は、実際には(2)でString型のインスタンスが 作成されている訳ではないのでしょうか? 少し混乱しています。 | ||||||||
|
投稿日時: 2006-03-29 21:17
自分でも混乱しがちですが、配列も変数ですので、
配列でない変数と同じ考えかたでよいはずです。
Object変数はString変数にできない。 Object配列変数はString配列変数にできない。 | ||||||||
|
投稿日時: 2006-03-30 14:25
かしんさん、ありがとうございます。
これで分かったように思えたのですが、以下のテストを行ってまた分からなくなりました。 ============================================= 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となります。 (2)でObject型インスタンス用の参照変数を作成しているのに、(4)でString型用の 参照変数に変わってしまったという事でしょうか? このテストを踏まえて以下のテストをしてみました。 ============================================= 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となります。 何が違うのでしょうか? | ||||||||
|
投稿日時: 2006-03-30 14:34
4の時点でobj2はStringになってるだろ。(格納してる方じゃなく実体の方) つまり、Object obj2 = new String("文字2");と結果同じなんだよ。 新たなインスタンスを参照するように変えてるんだからさ。 最初のじゃんぬねっと氏のヒントがまったく無駄になってるな。
こっちは当初の投稿となんら変わりないので『なぜか9ではこうなります』といわれてもね・・・ [ メッセージ編集済み 編集者: ぶさいくろう 編集日時 2006-03-30 14:38 ] | ||||||||
|
投稿日時: 2006-03-30 14:49
箱(変数宣言)と中身(インスタンス生成)をごっちゃにしてるんですね。
1回、分けて書いてみてはどうですか。
| ||||||||
|
投稿日時: 2006-03-30 14:58
もうひとつ行きましょうか。
以下のコードは9行目でClassCastExceptionが発生します。 その理由を考えてみてください。
|
1|2|3|4|5
次のページへ»