2012-03-19 91 views
2

如果你有兩個不同的類A和B,B是A的子類,如下所示,你可以不投:自定義對象鑄造方法

A a = new A(); 
B b = new B(); 
A newA = (A)b; 

有沒有一種方法,使上面的代碼工作(沒有更改上述代碼)沒有JVM拋出ClassCastException?

------------編輯----------

對不起,我在上面的問題的代碼犯了一個錯誤。正確的版本如下:

A a = new A(); 
B b = new B(); 
B newB = (B)a; 
+0

'class B extends A {}',對吧?即使沒有演員也應該工作。 – 2012-03-19 18:38:31

+0

在任何需要調用「A」類型的對象的情況下,「B」類型的對象都是可行的替代品,不需要強制轉換。 – 2012-03-19 18:39:02

+0

@OliCharlesworth它可能會使dscer工作的上下文...這只是一個簡單的例子 – 2012-03-19 18:39:21

回答

2

我想你可以簡單地分配:

A newA = b; 
4

B已經有一個是,一個關係A。你不需要施放它......你可以用期望/指向A的任何方法或引用來拋出B。

根據您的編輯 - 如果您想要這樣做,您的設計出現問題。雖然Bis-aA,相反的是不是是真的。 A不是B。換句話說,由於B延伸了A,它可能有方法/屬性在A上沒有定義。如果您將A轉換爲B,那麼接受該引用的方法可能會嘗試調用它認爲在該實例上的方法,因爲您告訴編譯器它有一個B,實際上,底層的A沒有要求方法。

在這裏鑄造只會導致疼痛和失敗。

2

如果BA子類上面應該工作,和演員是不必要的:

A a = new A(); 
B b = new B(); 
A newA = b; // no need to cast! 
1

有了新的代碼,不,你不能這樣做。你必須創建一個新的對象:

B newB = new B(a); 

B newB = B.of(a); 

非抽象的非葉類一般應避免反正。此外,自1.5(2004年發佈)以來,應該沒有太多的演繹語法。