從非Java背景到Scala帶來了包括這個在內的各種困難。Scala:downcasting throws java.lang.ClassCastException
scala> class A
defined class A
scala> class B extends A
defined class B
scala> val a = new A
a: A = [email protected]
scala> val b = new B
b: B = [email protected]
scala> a.asInstanceOf[B]
java.lang.ClassCastException: A cannot be cast to B
...
scala> b.asInstanceOf[A]
res1: A = [email protected]
我明白ClassCastException異常是因爲在運行時拋出,a
似乎並不像一個B,而事實上,它是(據我所知)。這裏發生了什麼?任何解決方法?謝謝。
編輯:JVM如何理解a
不能被鑄造到B
?它是否執行a.getClass
和B
之間的淺層比較?
ps。我試圖給庫類添加一個私有變量,並重寫一個接受庫中定義的類作爲參數的類方法(我試圖添加該字段的類)。
您可以擴展庫類並在擴展類中添加私有變量並使用該類來代替?函數和方法在Scala fyi中互相重疊。 – mythicalprogrammer
我按照你說的去做,我擴展並添加變量。但是,我需要重寫的方法庫中的工廠類只接受舊類作爲參數。 – parsa
@parsa與此比較:'val m:A = new B(); m.asInstanceOf [B]'。希望這會有所幫助。 – 2011-07-10 07:38:55