Java中的强制转换和动态与静态类型

时间:2010-04-20 04:55:45

标签: java casting

我正在学习静态类型和动态类型,我在很大程度上理解它,但这个案例仍然让我无法理解。

如果课程B延伸A,我有:

A x = new B();

是否允许以下​​内容?:

B y = x;

或者是否需要显式转换?:

B y = (B) x;

谢谢!

1 个答案:

答案 0 :(得分:16)

显式投射必需成功

它之所以需要是因为它总是成功:声明为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; 

是否需要强制转换仅由 所声明的变量类型确定, NOT 由它们在运行时引用的对象类型决定-时间。即使可以在编译时解析引用,也是如此。

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

此处,即使final变量o始终引用instanceof String,其声明的类型仍为Object,因此显式为(String)要编译,仍然需要