Java以外のバックグラウンドからScalaに移行すると、これを含むさまざまな困難がもたらされました。Scala:ダウンキャスティングでjava.lang.ClassCastExceptionがスローされる
scala> class A
defined class A
scala> class B extends A
defined class B
scala> val a = new A
a: A = [email protected]
scala> val b = new B
b: B = [email protected]
scala> a.asInstanceOf[B]
java.lang.ClassCastException: A cannot be cast to B
...
scala> b.asInstanceOf[A]
res1: A = [email protected]
私はClassCastExceptionが発生があるため、実行時にスローされることを理解し、a
はBのように見えるしていませんが、実際には、それは(私の知る限り理解して)です。何が起きてる?回避策はありますか?ありがとう。
編集:a
をB
にキャストできないことをJVMがどのように理解していますか? a.getClass
とB
の間でいくらか浅い比較を実行しますか?
ps。プライベート変数をライブラリクラスに追加しようとしていて、ライブラリに定義されているクラスを引数として受け入れるクラスメソッドの1つをオーバーライドしようとしています(クラスをクラスに追加しようとしています)。 Bは、それがダウンした階層だA.
ライブラリクラスを拡張して、拡張クラスにプライベート変数を追加し、代わりにそのクラスを使用できますか?関数とメソッドは、Scala fyiで互いにオーバーライドします。 – mythicalprogrammer
あなたが言ったように、私は変数を拡張して追加します。しかし、私がオーバーライドする必要があるメソッドを持つライブラリのファクトリクラスは、古いクラスだけを引数として受け入れます。 – parsa
@parsaこれと比べて: 'val m:A = new B(); m.asInstanceOf [B] '。うまくいけばそれはいくらか意味をなさないでしょう。 –