在Java中的铸造和动态与静态类型

问题描述:

我正在学习静态与动态类型,而我很大程度上了解它,但这种情况仍然没有解决。在Java中的铸造和动态与静态类型

如果类B扩展A,我有:

A x = new B(); 

为以下允许?:

B y = x; 

或者是明确的铸件所需?:

B y = (B) x; 

谢谢!

明确铸造是要求,并且将成功

为什么它需要的原因是因为它并不总是成功:声明为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