みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

「自作クラスの型」にキャストする方法について。

「自作クラスの型」にキャストする方法について。

Java初心者ですが、よろしくお願いします。

class AAA
class BBB

※クラスAAAはクラスBBBのスーパークラス(直属のスーパークラスとは限らない)とします。

class CCC

という3つのクラスがあるとして、

この場合、
class CCC{

AAA var;
BBB bbb;

void test(){
bbb = new BBB();
var = (AAA)bbb; //---★
}
}

というような、キャストは可能ですよね?(←確認1)

次に(確認1に問題が無い場合)、

クラスAAAとクラスBBBの格納場所(パッケージ関連の話です)について、
AAAとBBBがどういう位置関係にあるときに、上記のキャストは可能になるのでしょうか?
AAAとBBBが同一パッケージ内にある時だけでしょうか?(←確認2[質問の核])

で、さらに、

上記の「---★」の所で、
AAAクラスにキャストする処理をしていますが、
この時、AAAクラスのコンストラクタは呼ばれるのでしょうか?
(AAAをnewしていないけれど、キャスト処理でnewしたのと同じことになったりしますか?)

また、これと同様の質問になりますが、
仮に、クラスAAAの設計が、クラスAAAのインスタンスが生成された場合に、
何らかのコールバック処理が行われるような設計の場合、
この (AAA)bbb というキャストによって、想定しているコールバック処理
は行われたりしますでしょうか?(←確認3)

初心者らしからぬ質問かもしれませんが、
どなたか、どうか分かりやすく教えて下さい。

投稿日時 - 2010-08-19 17:10:31

QNo.6120810

困ってます

質問者が選んだベストアンサー

> bbb = new BBB();
> var = (AAA)bbb; //---★
> というような、キャストは可能ですよね?(←確認1)

わざわざ書かなくともキャスト無しで var = bbb; と代入できます。下の例も見てください。

var = new BBB(); //キャスト不要
bbb = (BBB)var; //キャスト必須

ANo.1の方が書いているとおり、簡単に試してみることができる内容ばかりなのであとは自力で確認してみてください。

投稿日時 - 2010-08-19 20:52:56

お礼

回答ありがとうございます。
NO.1のお礼の中でも書かせて頂いた通り、
テストプログラムを書いて検証しているところなのですが、
「確認3」の所は、(AAA)とキャストしたからと言って、
AAAがnewされるわけではなさそう、ということが分かってきました。

また、「確認1」は、書籍などから、おおかた正しいであろうと思っておりまして、
これも念のためテストプログラムにて検証し、問題なさそうだと分かってきました。
salsberryさんから頂いた回答も、大変勉強になりました。

で、問題の「確認2」ですが、
パッケージの異なるソースファイルの「コンパイル、実行」のあたりで、
つまづいていて、検証できずにおります。
ということで、こちらの問題をまず解決してきます!

投稿日時 - 2010-08-20 01:49:00

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ま~確かに「試せばわかる」かもしれないけど, 究極的に「言語仕様としてそうなっている」のか, それとも「その処理系ではそうなっているけど言語としては保証されていない」のかは区別つかないんではないかな>#1&#2.
Java の言語仕様って, (そうである「はず」のものは) 本屋にいけば見付かりますよね.

投稿日時 - 2010-08-19 23:37:04

お礼

回答ありがとうございます。
まだ私には難しい内容でしたが、なんとなく言わんとすることは分かります。

テストプログラムを的確に書ける方ですと、
そのあたりの高度な疑念が湧きそうですね。

初心者である私の場合、
まずは、自分の書いたテストプログラムが怪しい(笑)ので、
「このコードで、とりこぼしなく検証できているんだろうか」という疑念に
しばしば悩まされます。

今はパッケージの異なる2~3のファイル(AAA、BBB、CCC)の
コンパイル、実行あたりでつまずいております。(苦笑)
がんばります!

投稿日時 - 2010-08-20 02:00:32

ANo.1

簡単なテストプログラムを組めばすぐに分かることよ。
まずはやってみること。

その上で納得行かないなら質問して頂戴。

投稿日時 - 2010-08-19 17:24:55

お礼

回答ありがとうございます。
アドバイスを頂いた通り、テストプログラムを書き、
現在、検証しているところですが、
検証以前の所(パッケージ分け、コンパイル、実行の段階)でエラーが発生し、
こちらで停滞しております。
検証ができ次第、もし、疑問点がありましたら、補足を書かせて頂こうかと思っております。

投稿日時 - 2010-08-20 01:33:29

あなたにオススメの質問