Scala:downcasting抛出java.lang.ClassCastException

par*_*rsa 1 casting scala classcastexception downcast

从非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
Run Code Online (Sandbox Code Playgroud)

我知道ClassCastException被抛出,因为在运行时,a它看起来不像B,但实际上它是(据我所知).这里发生了什么?任何解决方法?谢谢.

编辑:JVM如何理解a无法转换为B?它a.getClass和之间进行了一些浅薄的比较B吗?

PS.我正在尝试将一个私有变量添加到库类中,并覆盖其中一个接受在库中定义的类作为参数的类方法(我正在尝试将该字段添加到的类).

myt*_*mer 6

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

是否有任何语言可以升级到层次结构?因为看起来你暗示有这样的语言.