【发布时间】:2016-10-06 00:11:41
【问题描述】:
我刚刚读到一本 OCA-Book(Oracle 认证助理):
“某些类型转换异常可以在编译时被检测为错误,但其他类型只能在运行时检测到”。
现在我正在尝试为这两种情况找到一个示例:编译时和运行时。
考虑以下类结构:
class A {}
class B extends A {}
class C extends B {}
以下演员表
Object o = new C();
B b = (B) o;
是正确的。所以代码可以在没有ClassCastException 的情况下运行。
演员表
Object o = new B();
C c = (C) o;
错了。对象o 至少是B 类型;所以它可以转换为B 或A。
但是这可以在运行时或编译时检测到吗? 我猜在编译时?!还是编译器只知道引用的类型,而不知道对象(在内存中)本身?如果这是真的,编译器无法在编译时确定强制转换是否正确。
感谢您的帮助!
【问题讨论】:
-
是runtime,编译器怎么会事先知道Object的类型?
-
你可以试试看——写个小程序,试着编译一下,看看编译器有没有报错;如果它编译,尝试运行它,看看你是否得到一个
ClassCastException。