1

Java 以外のバックグラウンドから Scala に移行したことで、この問題を含むさまざまな問題が発生しました。

scala> class A
defined class A

scala> class B extends A      
defined class B

scala> val a = new A
a: A = A@2e893a4a

scala> val b = new B
b: B = B@3a47c130

scala> a.asInstanceOf[B]
java.lang.ClassCastException: A cannot be cast to B
...

scala> b.asInstanceOf[A]
res1: A = B@3a47c130

実行時に ClassCastException がスローされることは理解していますが、これは実行時にaB のようには見えませんが、実際には (私が理解している限り) です。何が起きてる?回避策はありますか?ありがとう。

a編集:JVMはキャストできないことをどのように理解していBますか? a.getClassとの間の浅い比較を実行しますBか?

ps。ライブラリ クラスにプライベート変数を追加し、ライブラリで定義されたクラス (フィールドを追加しようとしているクラス) を引数として受け入れるクラス メソッドの 1 つをオーバーライドしようとしています。

4

2 に答える 2

6

下がっていくヒエラルキーです。クラス A はスーパー クラスであり、B はそれから拡張されているため、より具体的です。一般化で階層を上ることはできません。これは設計上の選択であり、サブタイピングに関連しています。

階層を上ることができる言語はありますか? そのような言語があることをほのめかしているように見えるからです。

于 2011-07-10T07:29:13.233 に答える
4

B は A よりも具体的であるため、 にキャストAすることはできません。B

于 2011-07-10T07:06:04.010 に答える