2017-02-16 11 views
0

を再割り当てするには、次のコードを考えてみましょう。私は次のコードでコンパイルエラーを取得する理由しかし、私は理解していない:私の視点から明示的なキャストと

class A{} 

class B extends A{ 

public static void main(String args[]){ 
    A exampleA = new A(); 
    B exampleB = new B(); 
    exampleA = exampleB; 
    exampleB = exampleA; // compile error 

をexampleBがするように、ポインタexampleAは現在、クラスBのオブジェクトである、同じオブジェクトを指しますさらに、ポインタexampleAを再割り当てするため、私は最後のコード行をexampleB = exampleBと等しく解釈します。コンパイラの意見は一致せず、コンパイラとは思えません。誰かが私にエラーが出る理由を教えてもらえますか?

私は両方のクラスに対してもgetClassメソッドを使用しました。出力は両方とも実際に同じオブジェクトを指していることを示しています。したがって、私は混乱しています。

私はプログラミングが初めてで、コンパイラの考え方について詳しく知りたいと思っています。質問に答えるだけでなく、コンパイラとランタイムロジックを区別するための書籍やその他の情報源に関するヒントは非常に役に立ちます!

私は2番目のコードブロックを解決する方法を知っていることに注意してください。これは明示的なキャストを行うだけです。

+3

は、実行時に' ClassCastException'を取得したいですs。 –

+3

Javaコンパイラはコード内の値をトラッキングしません。キャストせずに 'B'に' A'を代入することはできません。実行時に 'B'でなければ失敗する可能性があります。 –

+0

はい私はそれについて忘れていました、私は実行時にClassCastExceptionを取得します。なぜなら、初期化の間、それらはお互いに関連していないからです。 まだ、コンパイルエラーが発生する理由は私の質問には答えられません。なぜコンパイラはそれを見ないのですか? @AndyTurner:2番目のコメントは私の質問に部分的に答えました。ありがとうございました。あなたは顔の時間と呼ぶものから論理的な追跡を分離する方法を習得するにはどうすればよいですか?それを手伝ってくれる本はありますか? – AJavaStudent

答えて

1

コンパイラは自動的にその状況を検出しません。それを明示的にダウンキャストするとうまくいくはずです。次に、右側のオブジェクトが安全にダウンキャストできることを確認する責任があります。

キャストダウンキャストexampleB = (B) exampleA;

これを実行してダウンキャストできない場合は、実行時に例外が発生します。

また、Javaには「ポインタ」はありません。参照は似ていますが、同じではありません。

+0

実際、Javaでの参照はまさにポインタです。 –

-2

オブジェクトについては、同じタイプのものがあります。

しかし!ポインタにはまだ異なるタイプがあります。

だから、なぜこのエラー。

0

あなたはコンパイラについて知りたいと思われるようですので、できるだけ多くのことをここに入れておきます。 javaのjavaコンパイラは、ある人が信じるよりもずっと信頼しています。これは優れたケースです。javaでは人工的なキャスト機構を構築することができますが、ほとんどの場合は非常に困難です。したがって、コンパイラはここに戻り、あなたが何をしているのかを知っていると信頼します。ランタイムは、明らかに、物事が最も幻想的なやり方でうまくいかないところにあり、実際には、そのキャストは不可能であると見なされます。 この特定のケースでは、クラスAは明らかにクラスBの例になるようにダウンキャストできません。しかし、最後の2行を切り替えてください。エラーは発生しないと思います。これは、クラスBがクラスAの例になる可能性が最も高く、クラスAの例としてeBを設定し、eAをBに設定すると、クラスAの例として両者が見つかります。

class A{} 

class B extends A{} 

public static void main(String args[]){ 
    A exampleA = new A(); 
    B exampleB = new B(); 
    exampleB = exampleA; 
    exampleA = exampleB; // compile error should be fixed 
} 

編集: 私は間違っていたことを知った。詳細は以下のコメントを参照してください。ここに私の修正版です。すべての `B`sは` A`sあり、すべてではありませんが、 `A`sは 'B'以下のとおりです。「あなたは明示的なキャストを必要とするので、」あなたはそれをした場合

public static void main(String[] args) { 
    A eA = new A(); 
    B eB = new B(); 
    A newAfromB = eB; 
    eA = newAfromB; 
} 
+0

こんにちはシリウス、あなたの答えに感謝します。あなたは何を意味するのかをコードで教えてもらえますか?しかし、最後の2行を切り替えてください。エラーがないことがわかります。これは、クラスBがクラスAの例になる可能性が最も高く、クラスAの例としてeBを設定し、eAをBに設定すると、クラスAの例として両者が見つかります。 ありがとう君は! – AJavaStudent

+0

ああ、申し訳ありません!私はそれを編集しましたが、それは固執しなかったと思います。私はもう一度やり直します。私には分かります。 – Siris

+0

少し待ってください。ごめんなさい。私は忘れました - あなたは新しい宣言が必要です。私は間違っていた。 – Siris

関連する問題