2010-04-20 76 views
7

我正在學習靜態與動態類型,而我很大程度上了解它,但這種情況仍然沒有解決。在Java中的鑄造和動態與靜態類型

如果類B擴展A,我有:

A x = new B(); 

爲以下允許?:

B y = x; 

或者是明確的鑄件所需?:

B y = (B) x; 

謝謝!

回答

15

明確鑄造是要求,並且將成功

爲什麼它需要的原因是因爲它並不總是成功:聲明爲A x變量可以引用不instanceof B實例。

// Type mismatch: cannot convert from Object to String 
Object o = "Ha!"; 
String s = o; // DOESN'T COMPILE 

// Compiles fine, cast succeeds at run-time 
Object o = "Ha!"; 
String s = (String) o; 

// Compiles fine, throws ClassCastException at run-time 
Object o = Boolean.FALSE; 
String s = (String) o; 

無論是否需要強制轉換是由它們在運行時提及類型的對象的確定僅所涉及的聲明類型的變量,。即使引用可以在編譯時解析,也是如此。

final Object o = "Ha!"; 
String s = o; // STILL doesn't compile!!! 

這裏,即使final變量o將總指instanceof String,其聲明的類型仍然是Object,因此明確(String)投是仍然編譯所需

+0

非常感謝。我現在完全明白。 – XpdX 2010-04-20 05:12:39

+1

@XpdX:那麼你應該接受這是正確的答案。 – 2010-04-20 06:16:51