我正在学习静态类型和动态类型,我在很大程度上理解它,但是这个案例仍然没有找到我.
如果课程B延伸A,我有:
A x = new B();
Run Code Online (Sandbox Code Playgroud)
以下是允许的吗?:
B y = x;
Run Code Online (Sandbox Code Playgroud)
或者是否需要明确的演员?:
B y = (B) x;
Run Code Online (Sandbox Code Playgroud)
谢谢!
pol*_*nts 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;
Run Code Online (Sandbox Code Playgroud)
是否需要强制转换仅由所涉及的变量的声明类型决定,而不是由它们在运行时引用的对象类型决定.即使可以在编译时解析引用,也是如此.
final Object o = "Ha!";
String s = o; // STILL doesn't compile!!!
Run Code Online (Sandbox Code Playgroud)
在这里,即使final变量o总是指的是instanceof String,它的声明类型仍然是Object的,因此一个明确的(String)强制转换仍然需要进行编译.
| 归档时间: |
|
| 查看次数: |
10486 次 |
| 最近记录: |