
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ではないのでしょうか??????
No.3ベストアンサー
- 回答日時:
>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は不可
というわけですね。
>ポチ とは 犬 である。…正
犬 とは ポチ である。…誤
かなりわかりやすいです!!
つまり
犬=ポチという代入、ができても、ポチ=犬という代入はできない!、ということですね!
サブクラスにスーパークラスの参照を代入できない
という理解でよろしいでしょうか?
No.4
- 回答日時:
>犬=ポチという代入、ができても、ポチ=犬という代入はできない!、ということですね!
>サブクラスにスーパークラスの参照を代入できない
>という理解でよろしいでしょうか?
その通りです。
>Object
> +--Runnable
>ということになるのでしょうか・・・?
うーん、ここが「話がややこしくなる」ところです。
大掴みにはその理解でいいのですが、正確さに問題があります。
Runnableはインタフェースなので、Objectのサブクラスというわけではありません。
だから正しくは
Object
+--Runnableをimplemetsした任意のクラス
となります。
これを短く説明するのは難しいので、参考書の
「インタフェース」のところを読んでください。
No.2
- 回答日時:
Runnableはインターフェースでありクラスでは有りませんのでObjectのサブクラスには成りません。
Java言語仕様では1つのクラスしか継承できないので、このような仕掛けを使っています。インターフェースは関数や変数の定義だけが行われており、実装は各サブクラスに依存しています。
この回答への補足
すいませんもう少しお願いします。
この場合
Runnnable rn =(Runnnable)obj;
のようにキャストすることによってコンパイルできますよね。
キャストして通過するということは、
has a
なのでしょうか・・・???
RunnableとObjectがまったく無関係
であればキャストでもとおらないですよね・・・???
類似問題がいろいろあり混乱中です(*_*)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「IOException は対応する try ...
-
インタフェースのstatic変数(Java)
-
絶対パス ⇒ フォルダかファイル...
-
「タイプ初期化子が例外をスロ...
-
中学のクラス数
-
【sendkeysメソッドが動かずに...
-
インスタンス参照でアクセスで...
-
ヒグマを撃退
-
private static という変数の修飾
-
VBScriptからストアドプロシー...
-
String.containsの反対機能はあ...
-
どこからも呼ばれていない無意...
-
eclipse-Tomcatでのデバッグに...
-
サーブレットコンテキストの意...
-
javascriptのイベント処理につ...
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
ラジオボタンの選択判定
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
「継承されたメソッドの可視性...
-
C# 「データが失なわれる可能性...
-
メソッドの引数にクラス名を渡す
-
ゲッターを使わないで変数にア...
-
C#からDLLを呼びたいのですが・...
-
c++でのヘッダーファイルの循環...
-
interface,extend,implementの...
-
抽象クラスをJUNITでテストする...
-
Javaのインスタンス化の構文の...
-
【C#】クラスのコンストラクタ...
-
Excel vbaのプログラムでガンマ...
-
VB DLLプロジェクトについて
-
単体テストのテストケースにて...
-
デバッグ時に「Source not found」
-
「ラッパークラス」の存在意義...
-
Commons-Discovery.jarとは?
-
Ftpでの帯域制限の設定方法につ...
おすすめ情報