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)
强制转换。