重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

class ApBase extends Object implements Runnable
(省略)
ApBase aBase = new ApBase();

Object obj = aBase;
Runnable rn = obj;
×
コンパイラにとってobjはObjectなのでRunnnableインターフェイス参照への代入は認められません。


-----ー----
以前質問させてもらった内容の一部なのですが・・・
参照代入でコンパイルエラーを引き起こす場合
「is a」の関係が成り立っていない場合ですよね?
なぜコンパイルエラーなのですか?
Objectクラスはすべてのクラスのスーパークラスですよね・・・
Runnableとobjectはis aではないのでしょうか??????

A 回答 (4件)

>Runnableとobjectはis aではないのでしょうか?



この場合、is aの関係が逆です。
Runnable r;
Object o;
として、
o = r;
はできますが、
r = o;
はできません。

#1さんの言う通り、
a Runnable is an Object. …正
an Object is a Runnable. …誤
です。
ポチ とは 犬 である。…正
犬 とは ポチ である。…誤
のような関係です。

もっとも、オブジェクトの階層と、
インタフェースの階層は違うものなので、
上の記述は正確ではありません。
(ただしそれを言い出すと話がややこしくなるので略します。
大筋では上記のように考えてください)

キャストをすればコンパイルは通りますが、
obj変数で参照されているオブジェクトが
実際にRunnableでなかった場合、エラーが出ます。
(has aは関係ありません)

>RunnableとObjectがまったく無関係
>であればキャストでもとおらないですよね・・・???

キャストは、関係ない型のときでも、コンパイルを通してしまいます。
(↑これも細かく言うと正確ではないけど)
むりやり型を変えてしまうので、危険な操作なのです。
実際に互換性のある型かどうかは、プログラマが責任を持っています。

この回答への補足

Object
  +--Runnable

ということになるのでしょうか・・・?
今本でも見直したのですが、上に行くと暗黙キャストで参照を渡せる、と書いてあります。
で、obj=rnは可で、rn=objは不可
というわけですね。

>ポチ とは 犬 である。…正
犬 とは ポチ である。…誤


かなりわかりやすいです!!
つまり
犬=ポチという代入、ができても、ポチ=犬という代入はできない!、ということですね!
サブクラスにスーパークラスの参照を代入できない
という理解でよろしいでしょうか?

補足日時:2004/02/16 19:29
    • good
    • 0

>犬=ポチという代入、ができても、ポチ=犬という代入はできない!、ということですね!


>サブクラスにスーパークラスの参照を代入できない
>という理解でよろしいでしょうか?

その通りです。


>Object
>  +--Runnable
>ということになるのでしょうか・・・?

うーん、ここが「話がややこしくなる」ところです。
大掴みにはその理解でいいのですが、正確さに問題があります。
Runnableはインタフェースなので、Objectのサブクラスというわけではありません。
だから正しくは

Object
  +--Runnableをimplemetsした任意のクラス

となります。
これを短く説明するのは難しいので、参考書の
「インタフェース」のところを読んでください。
    • good
    • 0
この回答へのお礼

ありがとうございました
とてもたすかりました

お礼日時:2004/02/19 12:10

Runnableはインターフェースでありクラスでは有りませんのでObjectのサブクラスには成りません。



Java言語仕様では1つのクラスしか継承できないので、このような仕掛けを使っています。インターフェースは関数や変数の定義だけが行われており、実装は各サブクラスに依存しています。

この回答への補足

すいませんもう少しお願いします。

この場合
Runnnable rn =(Runnnable)obj;

のようにキャストすることによってコンパイルできますよね。
キャストして通過するということは、
has a
なのでしょうか・・・???

RunnableとObjectがまったく無関係
であればキャストでもとおらないですよね・・・???

類似問題がいろいろあり混乱中です(*_*)

補足日時:2004/02/16 14:32
    • good
    • 0

まずインターフェースのことを


勉強したほうがいいとおもいます。

>Runnableとobjectはis aではないのでしょうか??????

Runnable rn = obj;
でエラー。
Object is a Runnable
ではありませんから。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2004/02/17 12:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!