Scala:downcasting抛出java.lang.ClassCastException

时间:2011-07-10 07:02:14

标签: scala casting 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

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

编辑:JVM如何理解a无法投放到B?它是否在a.getClassB之间执行了一些浅层比较?

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

你不能将A投射到B,只能反过来,因为B比A更具体。