我正在学习静态类型与动态类型,并且我已经了解了它的大部分内容,但这种情况仍然让我困惑。
如果上课B
延伸A
, 我有:
A x = new B();
是否允许以下行为?:
B y = x;
或者是否需要显式转换?:
B y = (B) x;
Thanks!
显式转换是required, 还会succeed.
之所以需要它是因为它不always成功:变量声明为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;
是否需要演员阵容已确定only通过所涉及变量的声明类型,NOT通过它们在运行时引用的对象的类型。即使可以在编译时解析引用也是如此。
final Object o = "Ha!";
String s = o; // STILL doesn't compile!!!
在这里,尽管final
多变的o
将始终引用一个instanceof String
,其声明的类型仍然是Object
,因此显式(String)
演员阵容是still需要编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)