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

9

我正在学习静态类型和动态类型,现在大部分内容已经理解了,但是这个例子还是有些难以理解。

如果类B扩展自A,那么我有:

A x = new B();

以下内容是否允许?
B y = x;

或者需要进行显式转换吗?
B y = (B) x;

谢谢!

1个回答

17

需要进行显式转换,且转换将会成功。

之所以需要转换是因为它不总是能够成功:声明为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总是引用String的实例,它声明的类型仍然是Object,因此需要显式的(String)转换才能编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接