我正在学习静态类型和动态类型,现在大部分内容已经理解了,但是这个例子还是有些难以理解。
如果类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
总是引用String
的实例,它声明的类型仍然是Object
,因此需要显式的(String)
转换才能编译。