从非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.getClass
和B
之间执行了一些浅层比较?
PS。我正在尝试将一个私有变量添加到库类中,并覆盖其中一个接受在库中定义的类作为参数的类方法(我正在尝试将该字段添加到的类)。
答案 0 :(得分:6)
这是一个下降的层次结构。 A类是超类,B是从它扩展而来的,所以它更具体。你不能在泛化中提升层次结构。这是一个设计选择,与subtyping有关。
是否有任何语言可以升级到层次结构?因为看起来你暗示有这样一种语言。
答案 1 :(得分:4)
你不能将A
投射到B
,只能反过来,因为B比A更具体。