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 是因为在运行时,a它看起来不像是 B,但实际上它是(据我所知)。这里发生了什么?任何解决方法?谢谢。

编辑:JVM如何理解a不能转换为B?它会在 和 之间进行一些浅显的比较a.getClassB

附言。我正在尝试将私有变量添加到库类,并覆盖接受库中定义的类作为参数的类方法之一(我试图将字段添加到的类)。

4

2 回答 2

6

这是一个下降的层次结构。A 类是一个超类,B 是从它扩展而来的,所以它更具体。你不能在概括的层次上上升。这是一种设计选择,与子类型有关。

有没有什么语言可以让你提升层次?因为您似乎在暗示存在这种语言。

于 2011-07-10T07:29:13.233 回答
4

您不能A转换为B,只能反过来,因为 B 比 A 更具体。

于 2011-07-10T07:06:04.010 回答